繁体   English   中英

如何使用GCC在C程序中的函数之间暂停?

[英]How to pause between functions in a program in C with GCC?

所以我的问题是我的程序运行得太快,以至于我无法看到它的行为方式。 它应该使文本沿终端的边缘爬行。 我尝试使用sleep()printf(...) s之间做一个短暂的暂停,以便我可以在打印时看到文本的位置。

这就是它的样子:

http://i.imgur.com/B6FFbNp.gif

所以我在printf之后放了sleep()函数,这样它会在再次启动循环之前暂停并使文本缓慢移动。 但是,它会在程序开始之前无限期地暂停程序。 这也发生在usleepsystem("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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM