2013-07-08 174 views
4

我在while循環中使用了scanf()。爲什麼scanf卡在while循環中?

while(1) 
{ 
    int input = 0; 
    scanf("%d\n", &input); 
    printf("%d\n", input); 
} 

當我運行這個程序,我輸入一個數字,除非我再也不進數printf()不顯示該號碼。爲什麼?

+0

爲什麼你把'\ N'在'scanf'格式字符串?你做這件事的原因是什麼? – AnT

+0

以前出現過這個問題,但是我發現很難找到合適的重複。 [使用C中的scanf在EOF上退出while循環](http://stackoverflow.com/questions/17220158/exiting-a-while-loop-at-eof-using-scanf-in-c/)具有相同的基本問題,格式字符串在數字轉換周圍具有前導和尾隨空白)。我很確定它不是唯一的候選人;我不確定這是否是最佳人選。 –

回答

5

您的scanf格式中的\n被解釋爲「任意數量的空白」。它會一直讀取空格(空格,製表符或回車符),直到遇到不是空白的東西。

2

由於輸入格式中尾隨的\n,您會得到該行爲。它查找空白區域,並且不知道它何時完成掃描空白區域,直到遇到非空白字符。除非你真的知道你在做什麼,或者你實際上沒有處理用戶輸入(輸入來自程序或文件或字符串),否則不要在你的scanf()家族格式字符串中放置尾隨空白。

請注意,您的代碼應該檢查來自scanf()的返回值;如果遇到EOF,它將完全進入無限循環(或者,如果遇到非數字非空白字符)。另外,指定這樣的換行符不會強制每個輸入行一個數字。用戶可能會愉快地在一行中輸入1 2 3 4 5 6 7 8 9 0,並且在卡住之前,您的代碼將同樣愉快地循環9次。

也可以迴避使用fgets()(或POSIX getline())來讀取一個線路輸入的,然後使用sscanf()到讀數據轉換成數的問題。請注意,尾隨的換行符是無害的。

1
scanf("%d\n", &input); 

我通常只是去遵循

scanf("%d", &input); 

沒有 「\ n」

+0

離開輸出線的人是SO編程的麻煩之一。如果您希望輸出及時顯示,則應在輸出完成時輸出換行符。這對於診斷輸出是重要的。在程序崩潰或掛起之前沒有出現的診斷輸出沒有意義,並且輸出沒有用換行符結束可能不會出現。 (這個答案也與問題無關) –

+0

感謝您的評論,我認爲scanf與\ n沒有必要 – aah134

+0

順便說一句,我編輯了答案,我的意思是換行符與輸出,但不是在輸入:D – aah134

1

如果你看一個參考的scanf你會發現:

格式字符串由空白字符組成(格式字符串中的任何單個空格字符會消耗所有可用的連續字符從輸入空格字符)

所以\n會觸發這個效果,如果你不希望這種行爲只是離開了\n

scanf("%d", &input);