3

我正在尝试在 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;
}
4

5 回答 5

3

Eclipse 的终端仿真器可能会有所不同,并且会进行更多缓冲。尝试fflush(stdout);在打印输出和对scanf().

于 2009-12-13T18:18:35.913 回答
1

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

于 2009-12-13T18:27:14.613 回答
1

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

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

然后,在循环内,程序执行另一个scanf(). 这次输入缓冲区已经有东西了——即空间的“分钟”。scanf()将读取并忽略空格,找到无法转换为整数的 'm' 并停止而不为变量分配新值min返回0. 一次又一次……一次又一次……一次又一次。

所以,你要做的就是在每个scanf().

你清除了多少?
可能就 ENTER 而言 - 大致相同fgets():)
例如:

int ch;
scanf("%d", &min);
do { ch = getchar(); } while (ch != '\n'); /* empty buffer */
于 2009-12-13T22:29:00.870 回答
1

问题:运行代码时控制台为空白,再次尝试运行时出现错误。

答:首先,打开任务管理器(按 alt + ctrl + delete 键)并转到详细信息(在 Windows 10 中)。在列表中找到您的文件,右键单击该文件,然后单击“结束任务”。

其次,fflush(stdout);在everyprintfscanf语句之间使用。

例如:

printf("Enter number 1");
fflush(stdout);
scanf("%d",&a);
printf("Enter number 2");
flush(stdout);
scanf("%d",&b);
于 2020-06-19T13:04:00.553 回答
0

ECLIPSE Emulator 应该是不同的并且做更多的缓冲。

尝试在每次fflush(stdout);之间调用。printf();scanf();

它可能对你有帮助。

于 2020-10-24T06:54:16.167 回答