首页 > 解决方案 > 在控制台中移动光标和打印字符不适用于睡眠

问题描述

我想在同一个地方一个一个地打印一系列字符。我打印一个字母,然后在睡眠状态下等待 1 秒,使用控制台代码将光标向左移动一列,打印下一个字母,依此类推。问题是结果程序等待所有睡眠的总和(在我的示例中为 2 秒),然后仅打印最后一个字符('y')。nanosleep 也是如此,等待信号而不是睡眠。如何让它发挥作用?

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

int main()
{
    printf( "H" );
    sleep( 1 );
    printf( "\033[1D" );
    printf( "e" );
    sleep( 1 );
    printf( "\033[1D" );
    printf( "y" );
}

标签: clinuxunixterminal

解决方案


默认情况下(当连接到终端时)输出到stdout(这是printf写入的地方)line buffered。这意味着当缓冲区已满、打印换行符或显式刷新它时(使用 )刷新输出(实际上写入终端fflush)。

在您的情况下,由于您从不填充缓冲区并且不打印换行符,因此您需要fflush(stdout)在每次调用之前显式调用sleep.


推荐阅读