2009-12-13 85 views
2

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

似乎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; 
} 
+2

scanf函数是一个函数,是愚蠢的 - “这几乎是不可能做的scanf体面的错误恢复,通常读取整个行(使用fgets或类似的东西)要容易得多,然后使用sscanf或其他技术来解释它们。“ - 见http://www.eskimo.com/~scs/C-faq/q12.20.html – KernelJ 2009-12-13 18:21:45

+0

检查scanf的返回值,它可能提供更多的见解 – nos 2009-12-13 18:22:25

+0

虽然我试图学习C,但这是我教过的东西。令人沮丧的是,即使我认为代码是正确的,它也不起作用。 – 2009-12-13 18:23:15

回答

2

Eclipse的终端仿真器可能会不同并且会执行更多缓冲。尝试在打印输出和scanf()之间拨打电话fflush(stdout);

+0

工作正常!现在正在打印的行和问题正在被询问,但输入回应并不会使程序继续。 – 2009-12-13 18:20:34

+1

@Tyler:很高兴帮助。如果您觉得它解决了您的问题,您可以考虑接受此答案(单击我的答案旁边的复选标记)。另外,你发布了一个更像是评论的答案;考虑删除它。 – unwind 2009-12-13 18:51:46

+0

放松,感谢您的回应和建议。你的快速回答非常好。 – 2009-12-13 23:13:41

2

我将代码移入visual C++,并且按预期工作。我想我的问题应该是:“为什么eclipse中的终端模拟会被破坏?”

1

如果有在输入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 */ 
+0

谢谢,这是非常翔实的,但不是真的为什么它不工作。我还没有输入任何内容。 – 2009-12-13 23:14:59