4

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

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

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

4

4 回答 4

5

\n您的格式scanf中的 被解释为“任意数量的空格”。它一直读取空格(空格、制表符或回车),直到遇到不是空格的内容。

于 2013-07-08T02:15:52.253 回答
2

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

请注意,您的代码应该检查来自scanf();的返回值。如果遇到 EOF(或者,实际上,如果遇到非数字、非空白字符),它将完全进入无限循环。此外,像这样指定换行符不会强制每个输入行一个数字。用户可能会愉快地1 2 3 4 5 6 7 8 9 0在一行上打字,而您的代码同样会愉快地循环 9 次,然后才会卡住。

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

于 2013-07-08T02:17:11.460 回答
1

如果您查看scanf的参考资料,您会看到:

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

因此,\n将触发此效果,如果您不希望此行为,只需省略\n

scanf("%d", &input);
于 2013-07-08T02:21:50.997 回答
1
scanf("%d\n", &input);

我通常只是跟随

scanf("%d", &input);

没有“\n”

于 2013-07-08T02:19:31.443 回答