这段代码中的while是什么作用?

3
在以下代码片段中,循环(标记为“loop”)的作用是什么?:-
int main(void)
{
    char code;

    for (;;)
    {
        printf("Enter operation code: ");
        scanf(" %c", &code);
        while (getchar() != '\n')   // loop
            ;
        switch (code)
        {
        case 'i':
            insert();
            break;
        case 's':
            search();
            break;
        case 'u':
            update();
            break;
        case 'p':
            print();
            break;
        case 'q':
            return 0;
        default:
            printf("Illegal code\n");
        }
        printf("\n");
    }
}

免责声明:这段代码不完整,只是其中的一部分,因此它无法编译。


4
它一遍又一遍地调用 getchar()...你认为它做了什么? - Kerrek SB
1
请参考https://dev59.com/yGvXa4cB1Zd3GeqPLazH#13710915,了解一些有关`scanf`的技巧。 - xanatos
6个回答

7

这里使用getchar()函数来读取用户输入的额外字符和换行符\n。假设用户输入的操作码为

isupq\n // '\n' is for "Enter" button

然后,scanf() 仅会读取字符i,其余的五个字符将被该语句消耗。
while (getchar() != '\n')   
        ;  

因此,对于下一次迭代,scanf()将等待用户输入一个字符,而不是从输入缓冲区读取它。

那么为什么编译器在这里跳过对scanf()函数的调用呢?这段代码有什么问题?解决方案是什么?请看这里:http://ideone.com/txlQm8 - Destructor
1
@PravasiMeet;在函数getdata中,第二次迭代时,fgets正在读取由scanf留下的'\n'。请添加一个getchar();语句来吃掉这个换行符。http://ideone.com/Dap2Bj - haccks

3
while (getchar() != '\n')   // loop
;

这里的作用是清空缓冲区。

这个 while 循环解决的问题是 scanf(" %c", &code); 只从输入缓冲区中获取一个字符。尽管这样没什么问题,但在你的输入后,输入缓冲区中仍然有一个因按下“Enter”键而产生的换行符。需要对输入缓冲区进行清除。这就是 while 循环的作用。

这是 C 语言中常见的问题。


3
这是未定义行为。 - jrok

0

如果你使用fgetc函数,你就不必担心在无限循环中检查回车键。即使你输入多个字符,它也只会取第一个字符。

int main(void)
{
char code;

for (;;)
{
    printf("Enter operation code: ");
    code = fgetc(stdin);

    switch (code)
    {
    case 'i':
        insert();
        break;
    case 's':
        search();
        break;
    case 'u':
        update();
        break;
    case 'p':
        print();
        break;
    case 'q':
        return 0;
    default:
        printf("Illegal code\n");
    }
    printf("\n");
}
}

0

scanf() 通常不是扫描 char 变量的好方法,因为在输入字符后按下的回车将保留在输入缓冲区中。下一次调用 scanf("%c", &input) 时,已经存在于缓冲区中的这个 Enter 会被读取并赋值给 input,从而跳过用户的下一个输入。


0

在这里应用程序等待用户按Enter键。


0

由于给定代码中的for循环是一个无限循环,因此while循环正在检查输入字符是否为\n。如果输入的字符是\n,则它将移向switch case。一般来说,它在等待按下回车键以确认您的输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接