【问题标题】:Program Execution not Occuring in Expected Sequence程序执行未按预期顺序发生
【发布时间】:2020-01-05 16:29:50
【问题描述】:

我正在使用 Eclipse(最新版本)和 Cygwin GCC(我在使用 MinGW GCC 时也观察到了同样的问题,因此更改了 GCC)。 考虑一个简单的代码sn-p:

   #include<stdio.h>
int main(){
    char a[5];
    printf("prompt1\n");
    scanf("%s",a);
    printf("\Hi\t%s",a);
}

图像显示了程序的整个输出,如您所见,它们的顺序应该完全不同。 这个问题也出现在我的旧笔记本电脑上(相同版本的 Eclipse,带有 MinGW)。但是,我(显然)从未在旧版本的 Eclipse 上遇到过这个问题。 (sn-p 有不同的提示文本..但你明白了)

编辑:gets() 函数也会发生(但gets 和scanf 显然以正确的顺序显示)

【问题讨论】:

  • 这里有一个错字:printf("\Hi\t%s",a);。第一个反斜杠可能是无意的。
  • 尽管如此,错误仍然存​​在。帖子中的图像没有额外的反斜杠
  • 我不打算用它来解决问题,但是反斜杠会导致其他问题。您的问题已在下方得到解答。

标签: c eclipse eclipse-cdt


【解决方案1】:

printf 使用stdout,它是一个缓冲文件流。这意味着,它在其内部缓冲区已满(缓冲区大小为 512 字节或其他值)后将数据发送到输出。要立即将数据转储到控制台,请在scanf 之前使用函数fflush

#include<stdio.h>
int main(){
    char a[5];
    printf("prompt1\n");
    fflush(stdout);
    scanf("%s",a);
    printf("Hi\t%s",a);
}

【讨论】:

    【解决方案2】:

    我看到另一个 SO 帖子,其中 Cygwin 在需要时没有刷新 stdio。在 scanf 调用之前添加以下行应该可以修复它。

    fflush(stdout);
    

    【讨论】:

    • 确实可以解决它,但是,我在使用 MinGW(在另一个系统上)时也发现了该错误,它也不会在另一个系统或 linux 上的旧版本 Eclipse CDT 上发生(我没有不知道每个使用哪个编译器)
    • @coder123 它与编译器无关,这取决于输出是否进入交互式终端,请参阅stackoverflow.com/a/4201325/11941443 以及该问题的其余部分
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2011-02-25
    • 1970-01-01
    • 2021-09-15
    • 2021-01-04
    • 1970-01-01
    • 2015-07-26
    • 2022-12-10
    相关资源
    最近更新 更多