为什么C语言会在while循环中间卡住?

9
当我编译并运行此代码时(它是一个更大程序的一部分),Linux 在 while 循环完成一半后停止工作。
下面的代码打印出 time: 0,然后挂起,直到我暂停该进程。为什么会打印 time: 0,但不是以下的健全性检查行?
while (i < 5)
{
    printf("time: %d\n",elapsedTime);
    printf("sanity check");
    foo();
    i++;
}
1个回答

22

通常输出会被缓冲,只有在刷新或换行后才会被写入。In

printf("sanity check");

没有换行符,所以如果在此之后运行无限循环,您将看不到它。 请使用以下内容替换:

printf("sanity check\n");
或者
printf("sanity check");
fflush(stdout);

你会看到它。


太好了。我一直担心这个函数,但我认为我甚至都没能调用它。现在我知道我正在调用它,我可以继续调试了。谢谢!我会在10分钟后接受答案。 - Raven Dreamer
1
@Raven:如果你使用调试器来调试(提示就在名字里),你就会知道它已经执行到了哪一步,很可能也知道最终为什么失败了(毫无疑问是在foo()函数中)。 - Clifford
@Clifford - 是的。我已经被Visual Studio和C#开发宠坏了。不幸的是,我无法让VS处理纯C环境,所以我只能使用JEdit。 - Raven Dreamer
@Raven:但你说你在 Linux 上开发,可以在 Linux 上使用 GDB 或 GDB 前端,如 Insight 或 KDevelop。让 Visual C++ 编译 C 代码非常简单。只需用 .c 扩展名命名源文件即可。不要因为“添加新项”未提供 C 文件类型而感到困惑,只需忽略提供的默认值,在文件名框中输入 filename.c,然后就可以开始了。我还建议您使用“空项目”模板启动项目,这样它就不会为您生成任何 C++ 或 C++/CLI 模板代码。 - Clifford
@Clifford - 哎呀,那应该是GEdit,而不是JEdit。我会查一下的,谢谢。 - Raven Dreamer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接