2011-11-28 229 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