2011-11-28 105 views
9
#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并在此之后结束循环。谁能帮忙?while循环第二次忽略scanf

+0

看看这篇文章:http://www.gidnetwork.com/b-60.html –

+2

可能重复的[第二个scanf不工作](http://stackoverflow.com/questions/4023643/second-scanf - 不工作) – AShelly

+2

[Scanf在C语言中跳过while循环]的可能重复(http://stackoverflow.com/questions/1669821/scanf-skips-every-other-while-loop-in-c) –

回答

15

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

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

thx,它的工作原理。但为什么我必须在%c之前放置空格? – user1069968

+2

@ user1069968该空间使'scanf'忽略所有空格(包括换行符)。 – cnicutar

9

您可能必须输入换行符才能将输入发送到您的程序,对不对?第二次循环执行时,会读取正在“等待”读取并自动退出循环的换行符('\n' != 'y')。您可以通过使用此格式字符串,而不是scanf函数忽略空格:

" %c" 
+0

这是此主题上解释最好的答案。谢谢你保存我女朋友的作业! <3 –

+1

谢谢@AustinWitherow,我很高兴知道它对你有用:) – sidyll

-1

一种解决方案可以使用fflush(stdin)scanf()声明后清除输入缓冲区。

+1

'fflush(stdin)'在C编程中有未定义的行为。它可能在某些系统上按照预期工作,但一般来说这不是一个好习惯。 –

+0

@NisseEngström谢谢Nisse,我同意你的观点。这不是一个很好的做法,因为我们可以在这里看到https://stackoverflow.com/questions/9122550/fflushstdin-function-does-not-work –

+0

fflush stdin也可以在linux上工作,但避免使用它的UB,通过使用它你失去了可移植性。 – EsmaeelE