我在教自己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.然后它打印出它应该先打印出来的所有内容,然后退出。
例如,如果我启动程序然后键入7
,8
,9
和0
,在每个程序后点击返回,控制台应该看起来像这样:
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中的流量?
答案 0 :(得分:4)
这可能是因为输出被缓冲了。尝试使用printf
在每个fflush
之后刷新缓冲区,例如:
printf(...);
fflush(stdout);
scanf(...);
您甚至可以通过setbuf(stdout, NULL)
直接禁用缓冲。
答案 1 :(得分:3)
您完全理解流量控制。您只是不明白printf
和scanf
做了什么。
第一个问题,即printf
的输出被延迟,是因为标准IO库使用缓冲。也就是说,printf
实际上并不执行将数据写入终端的昂贵操作,直到它感觉到它,或者你告诉它。在这种情况下,fflush
是您的朋友:
printf("Please enter a number: ");
fflush(stdout);
第二个问题,即getchar()没有等待你的输入,与scanf
有关。 scanf
只读取形成其参数所需的字符 - 在本例中为整数。它会在输入流中保留所有其他字符。因此,当您输入“79”后跟换行符时,scanf
会读取7
,读取9
,并在输入流中保留换行符。随后getchar
完成 换行符,并且不会等待任何内容。
第二个问题的解决方案可能只是完全摆脱getchar()
。