简单的C流不按预期流动

时间:2014-01-16 21:02:24

标签: c flow

我在教自己C.我的背景是Java。 我正在编写一个简单的控制台应用程序,它应该提示用户输入一个数字,然后告诉用户他打印的是什么号码,然后提示他输入另一个号码。如果用户输入0,程序将退出。

我的代码没有按照我期望的方式运行。这是代码:

#include <stdio.h>

int main() {
    while (1) {
        printf("Please enter a number: ");
        int this_is_a_number = 0;
        scanf("%d", &this_is_a_number);
        printf("You entered %d\n", this_is_a_number);
        if (this_is_a_number == 0) {
            break;
        }
        getchar();
    }
    return 0;
}

当程序启动时,它不会提示我输入数字。它确实让我输入一个。在点击返回后,它让我输入另一个,依此类推,直到我返回0.然后它打印出它应该先打印出来的所有内容,然后退出。

例如,如果我启动程序然后键入7890,在每个程序后点击返回,控制台应该看起来像这样:

Please enter a number:
7
You entered 7
Please enter a number:
8
You entered 8
Please enter a number:
9
You entered 9
Please enter a number:
0
You entered 0

但相反,它看起来像这样:

7
8
9
0
Please enter a number:
You entered 7
Please enter a number:
You entered 8
Please enter a number:
You entered 9
Please enter a number:
You entered 0

我不了解C中的流量?

2 个答案:

答案 0 :(得分:4)

这可能是因为输出被缓冲了。尝试使用printf在每个fflush之后刷新缓冲区,例如:

printf(...);
fflush(stdout);
scanf(...);

您甚至可以通过setbuf(stdout, NULL)直接禁用缓冲。

答案 1 :(得分:3)

您完全理解流量控制。您只是不明白printfscanf做了什么。

第一个问题,即printf的输出被延迟,是因为标准IO库使用缓冲。也就是说,printf实际上并不执行将数据写入终端的昂贵操作,直到它感觉到它,或者你告诉它。在这种情况下,fflush是您的朋友:

printf("Please enter a number: ");
fflush(stdout);

第二个问题,即getchar()没有等待你的输入,与scanf有关。 scanf只读取形成其参数所需的字符 - 在本例中为整数。它会在输入流中保留所有其他字符。因此,当您输入“79”后跟换行符时,scanf会读取7,读取9,并在输入流中保留换行符。随后getchar完成 换行符,并且不会等待任何内容。

第二个问题的解决方案可能只是完全摆脱getchar()