Eclipse / MiniGW中的scanf问题

我试图在eclipse中运行以下代码,但控制台保持空白,直到我停止程序,此时输出“输入下一个值(<= 0退出)2130567168分钟是35509452小时,48分钟。” 一遍又一遍地重复着。

似乎scanf由于某种原因设置了一些默认值…无法弄清楚原因。 在程序停止之前我没有看到任何东西所以我认为它可能与printf没有被冲洗有关,但我确保使用\ n强制刷新。

有任何想法吗?

#include  const int MIN_PER_HOUR = 60; // minutes per hour int main(void) { int hour, min, left; printf("Convert minutes to hours and minutes!\n"); printf("Enter the number of minutes ( 0){ hour = min / MIN_PER_HOUR; // truncated number of hours left = min % MIN_PER_HOUR; // number of minutes left over printf("%d minutes is %d hours, %d minutes.\n", min, hour, left); printf("Enter next value (<=0 to quit)"); scanf("%d", &min); } printf("Done!\n"); return 0; } 

Eclipse的终端模拟器可能不同,并且可以进行更多缓冲。 尝试调用fflush(stdout); 打印输出和scanf()调用之间。

我将代码移动到Visual C ++中,它按预期工作。 我想我的问题应该是:“为什么eclipse中的终端仿真会被破坏?”

如果在scanf()的输入中有一个无效字符用于表示整数,则该函数将停止在该字符处, 将其保留在缓冲区中,准备好一次又一次地读取 ,然后再次…

假设您为第一个scanf()输入了“14分钟”。 该函数读取“14”并在空格处停止。 然后它将14分配给变量min并继续执行程序。

然后,在循环内,程序执行另一个scanf() 。 这次输入缓冲区已经有了东西 – 即带有空格的“分钟”。 scanf()将读取并忽略该空间,找到一个不能转换为整数的’m’,并在不向变量min赋值的情况下停止并返回值0 。 又一次……又一次……

因此,您需要做的是在每次scanf()之后清除输入缓冲区。

你清楚了多少?
可能就ENTER而言 – 这与fgets()大致相同:)
例如:

 int ch; scanf("%d", &min); do { ch = getchar(); } while (ch != '\n'); /* empty buffer */