【问题标题】:Problem with scanf in Eclipse / MiniGWEclipse / MinGW中的scanf问题
【发布时间】:2010-12-26 05:11:06
【问题描述】:

我正在尝试在 Eclipse 中运行以下代码,但控制台保持空白,直到我停止程序,此时输出“输入下一个值(

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

【问题讨论】:

  • scanf 是一个愚蠢的函数 - “使用 scanf 进行体面的错误恢复几乎是不可能的;通常读取整行(使用 fgets 等)然后解释它们要容易得多,或者使用 sscanf或其他一些技术。” - 见eskimo.com/~scs/C-faq/q12.20.html
  • 检查 scanf 的返回值,它可能会提供更多见解
  • 我正在尝试学习 C,这就是我被教导的内容。令人沮丧的是,即使我认为代码是正确的,它也不起作用。
  • 有一些实现可以正常工作。不幸的是,您显然正在使用一个没有。 fgets/sscanf 解决方案适用于所有平台,因此它不是无用的信息。
  • 绝对没有用!谢谢沃利克!

标签: c eclipse printf scanf


【解决方案1】:

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

【讨论】:

  • 行得通!现在正在打印行 a 并且正在询问问题,但输入响应不会使程序继续。
  • @Tyler:很高兴它有帮助。如果您认为它解决了您的问题,您可以考虑接受这个答案(单击我的答案旁边的复选标记)。此外,您发布的答案更像是评论;考虑删除它。
  • 放松一下,感谢您的回复和建议。您的快速回答很棒。
  • 谢谢!!我想知道这是编译器的问题还是什么。新手:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果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 */
    

    【讨论】:

    • 谢谢,这是非常有用的信息,但并不是它不起作用的真正原因。我还没有输入任何内容。
    【解决方案4】:

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

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

    其次,在每个printfscanf 语句之间使用fflush(stdout);

    例如:

    printf("Enter number 1");
    fflush(stdout);
    scanf("%d",&a);
    printf("Enter number 2");
    flush(stdout);
    scanf("%d",&b);
    

    【讨论】:

      【解决方案5】:

      ECLIPSE 模拟器应该有所不同,并提供更多缓冲。

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

      这可能对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        • 2015-01-23
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多