我真的不理解下面的代码。它是如何工作的(我的意思是I / O缓冲区)。我的代码中不需要\n
字符,它仍然有效!任何人都可以一步一步向我解释吗?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int x = -1;
do
{
printf("Give x: ");
scanf("%d", &x);
}while(x<=0);
printf("x = %d\n", x);
x = -1;
while(x<=0)
{
printf("Give x: ");
scanf("%d", &x);
}
printf("x = %d\n", x);
return 0;
}
答案 0 :(得分:3)
根据scanf's documentation on cplusplus.com:
Whitespace character: the function will read and ignore any whitespace characters
encountered before the next non-whitespace character (whitespace characters include
spaces, newline and tab characters -- see isspace). A single whitespace in the format
string validates any quantity of whitespace characters extracted from the stream
including none).
这就是为什么您不需要在\n
scanf
中指定scanf
,下一个{{1}}来电只会忽略它。
答案 1 :(得分:1)
剥离OP可能理解的部分,查看scanf()
来电。
"%d"
格式说明符表示要扫描可选空格(空格,制表符,\ n等),然后扫描int
。这通常会持续到遇到不属于int
的字符。然后该字符是“ungotten”(放回输入缓冲区)。
说你的输入是" 123 -456"
。第一个while循环后" -456"
将保留在输入缓冲区中。第二个while循环将使用" -456"
。假设stdin
之后-456
已关闭,则scanf()将检测到没有更多数据并将x
设置为值-456。由于x
仍为负数,第二个while循环再次执行scanf()
。这一次,没有数据,scanf()
不会更改x
并返回EOF,这很遗憾没有被监控。结果:无限循环。
现在尝试" 123a 456"
。第一个while循环后"a 456"
将保留在输入缓冲区中。第二个while循环将调用scanf()
并且无法转换任何内容,因为a
不会开始数字 - 因此x
保持为-1。 scanf()
将返回0,遗憾的是,它不会监视。未开始使用的a
将保留在输入缓冲区中。第二个while循环再次调用scanf()
,这将执行相同的操作,从而产生无限循环。
do {
...
scanf("%d", &x);
} while (x<=0);
...
x = -1;
while (x<=0) {
...
scanf("%d", &x);
}
最好使用fgets()/sscanf()
对来输入用户输入。
(用户输入 evil !)