当使用while循环时,第二次scanf被忽略。

10
#include <stdio.h>

int main ()
{
    char loop='y';
    while(loop != 'n') {
        printf("loop? ");
        scanf("%c", &loop);
        if(loop != 'y') {
            loop='n';
        }
    }
    return 0;
}
如果我输入“y”,他会重新启动while循环,但第二次会忽略scanf,并在此之后结束循环。有人能帮忙吗?

请查看这篇文章:http://www.gidnetwork.com/b-60.html - Fred Larson
2
可能是重复的问题:第二个scanf无法工作 - AShelly
2
可能是Scanf在C中跳过每个其他while循环的重复问题。 - Fred Larson
3个回答

19

确保 scanf 丢弃换行符。将其更改为:

scanf(" %c", &loop);
       ^

2
@user1069968 那个空格会让 scanf 忽略所有的空白字符(包括换行符)。 - cnicutar

11

你可能需要输入一个换行符,以便输入进入你的程序,对吧?第二次循环执行时,它读取了那个等待被读取的换行符并自动退出了循环('\n' != 'y')。你可以使用下面这个格式字符串让scanf忽略空格:

" %c"

这是本帖中最好解释的答案。谢谢你拯救了我女朋友的作业!<3 - Austin Witherow
1
感谢@AustinWitherow,很高兴知道它对你有用 :) - sidyll

-2
一个解决方案可以是在scanf()语句后使用fflush(stdin)来清除输入缓冲区。

1
在C编程中,fflush(stdin)具有未定义的行为。它可能在某些系统上按预期工作,但通常不是一个好的做法。 - Nisse Engström
@NisseEngström 谢谢Nisse,我同意你的观点。正如我们在这里所见:https://dev59.com/nF_Va4cB1Zd3GeqPY_-g,这不是一个好的实践。 - dark_cypher
fflush stdin 在 Linux 上也可以工作,但避免使用它,因为这是未定义行为,使用它会失去可移植性。 - EsmaeelE

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