我正在尝试在eclipse中运行以下代码,但控制台保持空白,直到我停止程序,此时输出“输入下一个值(< = 0退出)2130567168分钟是35509452小时,48分钟。 “一遍又一遍地重复。
似乎scanf由于某种原因放入了一些默认值...无法弄清楚原因。在程序停止之前我没有看到任何东西所以我认为它可能与printf没有被冲洗有关,但我确保使用\ n来强制冲洗。
有什么想法吗?
#include <stdio.h>
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 to Quit):\n");
scanf("%d", &min); // read number of minutes
while(min > 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;
}
答案 0 :(得分:3)
Eclipse的终端模拟器可能不同,并且可以进行更多缓冲。尝试在打印输出和fflush(stdout);
的调用之间调用scanf()
。
答案 1 :(得分:1)
我将代码移动到visual C ++中,它按预期工作。我想我的问题应该是:“为什么eclipse中的终端仿真会被破坏?”
答案 2 :(得分:1)
如果在scanf()
的输入中有一个无效字符用于表示整数,则该函数将停在该字符处,将其保留在缓冲区中,准备再次读取,然后再次,再次......
假设您为第一个scanf()
输入了“14分钟”。该函数读取“14”并在空格处停止。然后它将14分配给变量min
,程序继续。
然后,在循环内,程序执行另一个scanf()
。这次输入缓冲区已经有了东西 - 即带有空格的“分钟”。 scanf()
将读取并忽略该空格,找到一个无法转换为整数的“m”,并在不为变量min
指定新值且返回值{的情况下停止{1}} 即可。再次......再次......再次。
因此,您需要做的是在每0
之后清除输入缓冲区。
你清楚了多少?
可能就输入而言 - 大致相同scanf()
确实:)
例如:
fgets()
答案 3 :(得分:1)
问题:运行代码时控制台变为空白,再次尝试运行时出现错误。
答案:首先,打开任务管理器(按alt + ctrl +删除键)并转到详细信息(在Windows 10中)。在列表中找到您的文件,右键单击该文件,然后单击“结束任务”。
第二,在每个fflush(stdout);
和printf
语句之间使用scanf
。
例如:
printf("Enter number 1");
fflush(stdout);
scanf("%d",&a);
printf("Enter number 2");
flush(stdout);
scanf("%d",&b);
答案 4 :(得分:0)
ECLIPSE模拟器应该有所不同,并进行更多缓冲。
尝试每次在fflush(stdout);
和printf();
之间调用scanf();
。
这可能对您有帮助。