2013-07-08 176 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);