为什么scanf卡在while循环中?

时间:2013-07-08 02:11:07

标签: c

我在while循环中使用了scanf()。

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

当我运行此程序并输入一个数字时,除非我再次输入另一个号码,否则printf()不会显示该号码。为什么呢?

4 个答案:

答案 0 :(得分:5)

\n格式的scanf被解释为“任意数量的空白”。它不断读取空格(空格,制表符或回车符),直到它碰到不是空格的东西。

答案 1 :(得分:2)

由于输入格式中的尾随\n,您会得到该行为。它寻找空白区域,并且不知道它何时完成扫描空白区域,直到它遇到非白色空格字符。不要在scanf() - 系列格式字符串中添加尾随空格,除非您确实知道自己在做什么,或者实际上并未处理用户输入(输入来自程序或文件或字符串)。

请注意,您的代码应检查scanf()的返回值;如果它遇到EOF(或者,如果它遇到非数字,非白色空格字符),它将完全进入无限循环。此外,指定这样的换行不会强制每个输入行一个数字。用户可能会在一行中快乐地键入1 2 3 4 5 6 7 8 9 0,并且您的代码在循环之前会同样快乐地循环9次。

您还可以使用fgets()(或POSIX)来规避问题 getline())读取一行输入,然后使用sscanf()将读取的数据转换为数字。请注意,尾随换行符无害。

答案 2 :(得分:1)

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

我通常会跟随

scanf("%d", &input);

没有“\ n”

答案 3 :(得分:1)

如果查看scanf的参考文献,您会看到:

  

格式字符串由空格字符组成(格式字符串中的任何单个空白字符都会占用输入中所有可用的连续空白字符)

因此\n会触发此效果,如果您不希望此行为只是遗漏\n

scanf("%d", &input);