我必须输入两次才能让我的 getchar() 工作

I have to enter twice for my getchar() to work

我对 getchar() 有疑问。我必须输入两次才能让我的代码正常工作。我这样写我的代码:

#include<stdio.h>
#include<stdlib.h>
#define MAX_LEN 20

struct part {
    int number;
    char name[MAX_LEN + 1];
} part_1;
 
int main(void){
    int ch, th; 

    for (;;) {
        printf("Enter operation code: ");
        while ( (ch = getchar()) != '\n' && ch != EOF){
            switch (ch){

                case 'i': 
                printf("Enter part number: ");
                scanf("%d",&part_1.number);

                while ( (th = getchar()) != '\n'); /*I use this to remove newline character*/

                printf("Enter part name: ");
                fgets(part_1.name,MAX_LEN,stdin);
                break; 
                
                case 'q': exit(0);
            }
        }
    }
}   

当运行编译时,我希望我的结果是这样的:

Enter operation code: i
Enter part number: 1
Enter part name: test
Enter operation code: i

但是,我必须输入两次才能使代码正常工作:

Enter operation code: i
Enter part number: 1
Enter part name: test
-> /* This is where I have to press 'Enter' twice */
Enter operation code: i

当您输入零件名称并按回车键时 fgets 将从 switch-statement 中 return 和 break 退出并返回到 while-statement: while ( (ch = getchar()) != '\n' && ch != EOF){。然后,您需要再按一次回车键,使条件 false 返回到 for 语句,在该语句中再次打印“输入操作代码:”。

基本上你想找到一种方法来从 和 switch-statement 和 while-statement 中突破,当一个部分名称被读取时。

现在,我不确定 是否希望它正常运行,但您可以尝试将 while-statement 替换为:

[...]
    for (;;) {
        printf("Enter operation code: ");
        ch = getchar();
        if (ch != '\n') getchar();  // remove linebreak from stdin
        switch (ch){
[...]

输出将如下所示:

Enter operation code: a
Enter operation code: b
Enter operation code: c
Enter operation code: i
Enter part number: 1234
Enter part name: hello
Enter operation code: d
Enter operation code: e
Enter operation code: f
Enter operation code:
Enter operation code:
Enter operation code: q