我必须输入两次才能使getchar工作

问题描述

我因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

解决方法

当您输入零件名称并按Enter时,fgets将返回,break从切换状态退出,并返回至while状态: while ( (ch = getchar()) != '\n' && ch != EOF){。然后,您需要再按一次Enter键使条件false变为for语句,在该语句中它将再次打印“输入操作代码:”。

基本上,您希望找到一种方法,在读取零件名称后,同时从 和switch语句中退出。

现在,我不确定是否确实希望它起作用,但是您可以尝试将while语句替换为:

[...]
    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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...