向stdout显示单行以更新部分而不是在C中打印新行

cHa*_*Ham 1 c linux stdout

是否可以在包含变量的Linux OS上向控制台打印(在C中)一行文本,以便在变量更改时更改打印行而不是打印新行?例如,如果我有以下C代码:

void main()
{
     int i;
     for(i=1;i<=10;i++){
        printf("%d\n",i);
        sleep(5);
     }
}
Run Code Online (Sandbox Code Playgroud)

这样就可以打印十行.但我想打印一行更新自己以显示i它何时发生变化的价值.

cro*_*urg 5

类似下面的内容应该可以完成这项工作(取自/修改自如何更新终端中打印的消息而不重新打印(Linux)

int main(int argc, char *argv[]) {
  for(int i=1;i<=10;++i) {
    printf("\r[%3d%%]",i);
    fflush(0);
    sleep(5);
  }
  printf("\n");
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 5

在Linux上,void main(void)是未定义的行为; 返回类型是int- 没有例外.在Windows上,规则是不同的; 在Unix上,它们很简单 - main()返回int!

使用'\r'回车符和fflush():

#include <stdio.h>

int main(void)
{
     int i;
     for (i = 1; i <= 10; i++)
     {
        printf("\r%d", i);
        fflush(stdout);
        sleep(5);
     }
     putchar('\n');
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

curses除非您的显示需要变得更复杂,否则无需使用库.

注意:如果您正在倒计时(或者当前输出行的长度因任何原因而减少),则需要确保在先前显示的数据上写入空白.因此,例如,您可能需要格式字符串"\r%-4d"从9999到0进行计数,而不会在显示屏上留下不需要的数字.

  • 只要生成的字符串(数字)严格减少,这就会很好地工作。从 81.11 MB 到 81 MB 再回到 80.88 MB 的计数器可能会受到更多影响,但关键点是确保每次都会删除多余的字符。(所说的计数器让我很恼火;它们应该在中间显示 81.00 MB;如果与报告 2 dp 相关,请始终如一地执行!) (2认同)