printf和scanf如何在循环中工作?为什么我不需要在scanf中使用\ n?

时间:2013-11-18 20:36:34

标签: c while-loop printf scanf do-while

我真的不理解下面的代码。它是如何工作的(我的意思是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;
}

2 个答案:

答案 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 !)