Eclipse / Minigw中的Scanf的问题
题
我正在尝试在Eclipse中运行以下代码,但是控制台保持空白,直到我停止程序为止输出“输入下一个值(<= 0 to退出)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;
}
解决方案
Eclipse的终端模拟器可能会有所不同,并且可以进行更多的缓冲。尝试打电话 fflush(stdout);
在打印输出和调用之间 scanf()
.
其他提示
我将代码移至Visual C ++中,并且可以按预期工作。我猜我的问题应该是:“为什么日食中的末端仿真?”
如果有一个无效的字符用于表示输入中的整数 scanf()
, ,功能将停止在该字符上, 将其留在缓冲区中,准备再次阅读 又一次...
假设您进入了第一个“ 14分钟” scanf()
. 。该功能读取“ 14”,并在空间停止。然后将14分配给变量 min
该程序仍在继续。
然后,在循环内,程序执行另一个 scanf()
. 。这次,输入缓冲区已经有了东西 - 即带有空间的“分钟”。 scanf()
将读取并忽略空间,找到一个“ M”,它不能转换为整数并停止而不为变量分配新值 min
和 返回价值 0
. 。再次……又一次……又一次。
因此,您要做的就是清除输入缓冲区 scanf()
.
您清楚多少?
大概就输入而言 - 大约相同 fgets()
做 :)
例如:
int ch;
scanf("%d", &min);
do { ch = getchar(); } while (ch != '\n'); /* empty buffer */
不隶属于 StackOverflow