我试图在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 */
以上就是c/c++开发分享Eclipse / MiniGW中的scanf问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559939.html