[英]Why is scanf stuck inside a while loop?
我在while循環中使用了scanf()。
while(1)
{
int input = 0;
scanf("%d\n", &input);
printf("%d\n", input);
}
當我運行這個程序,並輸入一個數字時, printf()
不會顯示該數字,除非我再次輸入另一個數字。 為什么?
scanf
格式的\\n
被解釋為“任意數量的空格”。 它一直在讀取空格(空格,制表符或回車符),直到它碰到不是空格的東西。
由於輸入格式中的尾隨\\n
,您會得到該行為。 它尋找空白區域,並且不知道它何時完成掃描空白區域,直到它遇到非白色空格字符。 不要在scanf()
家庭格式字符串中放置尾隨空格,除非你真的知道你正在做什么或者你實際上沒有處理用戶輸入(輸入來自程序或文件或字符串)。
請注意,您的代碼應該檢查scanf()
的返回值; 如果它遇到EOF(或者,如果它遇到非數字,非白色空格字符),它將完全進入無限循環。 此外,指定這樣的換行不會強制每個輸入行一個數字。 用戶可以在一行中快樂地鍵入1 2 3 4 5 6 7 8 9 0
,並且您的代碼在被卡住之前將同樣快速循環9次循環。
您還可以通過使用fgets()
(或POSIX getline()
)讀取輸入行,然后使用sscanf()
將讀取的數據轉換為數字來規避問題。 請注意,尾隨換行符是無害的。
scanf("%d\n", &input);
我通常只是跟隨
scanf("%d", &input);
沒有“\\ n”
如果你查看scanf的參考,你會看到:
格式字符串由空格字符組成(格式字符串中的任何單個空格字符都使用輸入中的所有可用連續空白字符)
所以\\n
會觸發這種效果,如果你不希望這種行為只是遺漏了\\n
:
scanf("%d", &input);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.