-1

当我执行以下代码时

#include<stdio.h>
#include<unistd.h>

int main(void)
{
    int i; 
    for(i=0;i<=100;i++)
    {
        printf("Percentage complete: %d %%",i);
        sleep(1);
    }
    printf("\n");
}

但是,当我执行以下代码时,该代码不起作用,

#include<stdio.h>
#include<unistd.h>

int main(void)
{
    int i; 
    for(i=0;i<=100;i++)
    {
        printf("\nPercentage complete: %d %%",i); //There is a newline here
        sleep(1);
    }
    printf("\n");
}

该代码似乎有效。我不确定为什么。

4

3 回答 3

10

我假设您的意思是,当您说它“不起作用”时,您不会每秒看到一行新的输出。

这是因为终端通常是行缓冲的,这意味着它们在收到整行之前不会执行显示传入文本的工作。

您可以通过“刷新”输出流来解决此问题,强制终端显示它:

fflush(stdout);

此外,您的代码returnmain().

于 2013-01-14T15:09:14.550 回答
4

文本被printf()发送到stdout缓冲区。此缓冲区在换行符上自动刷新。因此,如果您不打印换行符,则缓冲区不会自动刷新。

要手动刷新缓冲区,请使用fflush(stdout),如下所示:

for(i=0;i<=100;i++)
{
  printf("Percentage complete: %d %%",i);
  fflush(stdout);
  sleep(1);
}

假设您想一遍又一遍地更新同一行(具有一种百分比增加的动画),您可能希望\r在打印的文本前面:

printf("\rPercentage complete: %d %%",i);
于 2013-01-14T15:09:55.477 回答
3

printf是缓冲输出。在缓冲区已满或遇到换行符之前,数据不会打印到控制台。

fflush您可以通过调用来强制打印数据stdout

于 2013-01-14T15:09:57.097 回答