[英]How to pause between functions in a program in C with GCC?
所以我的问题是我的程序运行得太快,以至于我无法看到它的行为方式。 它应该使文本沿终端的边缘爬行。 我尝试使用sleep()
在printf(...)
s之间做一个短暂的暂停,以便我可以在打印时看到文本的位置。
这就是它的样子:
http://i.imgur.com/B6FFbNp.gif
所以我在printf
之后放了sleep()
函数,这样它会在再次启动循环之前暂停并使文本缓慢移动。 但是,它会在程序开始之前无限期地暂停程序。 这也发生在usleep
和system("pause 1")
。 这就是它的样子:
http://i.imgur.com/krGW3lB.gif
================================================== ================================
编辑:
好吧,我自己想出来了。 似乎sleep()
只有在我的字符串中放入\\n
才有效。 我不知道为什么。 我甚至没有在该死的手册中读过这篇文章。
所以,如果你有
printf("HELLO\n");
sleep(3);
printf("HELLO\n");
sleep(3);
printf("HELLO\n");
它将导致:
HELLO
[暂停3秒]
HELLO
[暂停3秒]
HELLO
但如果删除换行符,它将:
[暂停9秒] HELLO HELLO HELLO
我不知道为什么会这样,但事实就是如此
================================================== ================================编辑:
这就是我希望我的程序工作的方式: http : //i.imgur.com/DXv7E60.gif
谢谢您的回答
你的观察不是因为sleep()
不起作用,而是因为printf()
使用stdout
,这是行缓冲的。 “line buffered”意味着,已经写入stdout
被缓冲,直到在缓冲区内容被刷新之前到达行尾。
所以在第一次printf("HELLO");
输出不会进入屏幕而是停留在缓冲区中,然后进入sleep(1);
被执行并让你等待。 然后是下一个printf("HELLO");
输出仍然没有进入屏幕,但下面的sleep(1);
再次让你等待1秒......依此类推,直到你的程序通过程序打印'\\n'
或程序结束到达行结束,这会隐式地将输出缓冲区刷新到控制台。
您可以通过在每个printf()
之后显式刷新stdout
的输出缓冲区来避免此行为:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("HELLO");
fflush(stdout);
sleep(3);
printf("HELLO");
fflush(stdout);
sleep(3);
printf("HELLO");
/* fflush(stdout); */ /* not needed as buffers are implicitly flushed on the program's end */
return 0;
}
我通常做的快速黑客是制作一些缓冲区数组(例如char buf [10])并在迭代之间放置一个fgets(),这迫使程序等待来自用户的换行符。 所以,例如,如果我们有:
.
.
.
for(i = 0; i < 1000000; ++i)
printf("%d\n", i);
我们可以做
.
.
.
char buf[10];
for(i = 0; i < 1000000; ++i){
printf("%d\n", i);
fgets(buf, 10, stdin);
}
并使用回车键控制迭代。
我们也可以通过使用模数来停止每第n次迭代。 使用上面的示例,我们现在将停止每100次迭代:
.
.
.
char buf[10];
for(i = 0; i < 1000000; ++i){
printf("%d\n", i);
if(i % 100 == 0)
fgets(buf, 10, stdin);
}
更耗时但有效的方法是使用像GDB这样的专用调试器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.