3

所以我的问题是我的程序运行得太快,以至于我看不到它的行为。它应该使文本沿着终端的边缘爬行。我试着在 ssleep()之间做一个短暂的停顿printf(...),这样我就可以看到我们在打印文本时的去向。

这是它的样子:

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

所以我把sleep()函数放在printfs 之后,这样它就会在再次开始循环之前暂停,并使文本缓慢移动。但是发生的情况是它甚至在开始之前无限期地暂停程序。这也发生在usleepandsystem("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

谢谢您的回答

4

2 回答 2

6

您的观察不是因为没有工作,而是因为使用行缓冲sleep()的事实。“行缓冲”意味着,已写入的内容被缓冲,直到在缓冲区的内容被刷新之前到达行尾。printf()stdoutstdout

因此,在第一次之后printf("HELLO");,输出不会进入屏幕而是停留在缓冲区中,然后sleep(1);执行并让您等待。然后对于下一个printf("HELLO");输出仍然没有进入屏幕,但以下 sleep(1);再次让你等待 1 秒......依此类推,如果你的程序打印 a'\n'或程序结束时到达行结束,这会隐式刷新输出缓冲区到控制台。

stdout您可以通过在 every 之后显式刷新输出缓冲区来避免该行为printf()

#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;
}
于 2013-06-23T08:01:37.703 回答
1

我通常做的一个快速破解是制作一些缓冲区数组(例如 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 这样的专用调试器。

于 2013-06-23T05:50:43.183 回答