代码之家  ›  专栏  ›  技术社区  ›  Tyler Brock

eclipse/minigw中的scanf问题

  •  3
  • Tyler Brock  · 技术社区  · 15 年前

    我正在尝试在Eclipse中运行以下代码,但是控制台将保持空白,直到我停止程序,此时输出“Enter Next Value(<=0 to Quit)2130567168 minutes is 3550952 hours,48 minutes.”会反复出现。

    似乎是因为某种原因,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;
    }
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   unwind    15 年前

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

        2
  •  1
  •   Tyler Brock    15 年前

    我把代码移到VisualC++中,它像预期的一样工作。我想我的问题应该是:“为什么Eclipse中的终端仿真会被破坏?”

        3
  •  1
  •   pmg    15 年前

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

    假设你第一次输入“14分钟” SCAN() . 该功能读取“14”并在空间停止。然后将14赋给变量 min 程序继续。

    然后,在循环内部,程序执行另一个 SCAN() . 这一次输入缓冲区已经有了一些内容——即“分钟”和空间。 扫描因子() 将读取并忽略空格,找到无法转换为整数的“m”,然后在不为变量分配新值的情况下停止。 返回值 0 . 再一次…再一次…又一次。

    所以,您需要做的是在每次 SCAN() .

    你清了多少?
    可能到了入口——差不多一样 fgets() 做:)
    例如:

    int ch;
    scanf("%d", &min);
    do { ch = getchar(); } while (ch != '\n'); /* empty buffer */