在C中使用printf加载点效果

时间:2018-08-23 10:12:34

标签: c printf

我要打印一个简单的加载消息,即“加载中...”,其中点之间是一一延迟地引入的。显示第三个点时,我要删除这些点并重新开始。

我正在尝试的代码是:

PRINTF("Loading");
for(int i=0;i<=3;i++){
    DelayMs(800);
    PRINTF(".");
}
DelayMs(800);
PRINTF("\r               ");
PRINTF("\r");

由于某种原因,我的行为很奇怪,我也不知道为什么。我在屏幕上看到的是以下几行之一:

          .Loading....
Loading   .Loading....

谢谢。

2 个答案:

答案 0 :(得分:1)

当输出不包含换行符时,使用fflush(stdout)强制打印。
格式说明符%.*s将输出长度受整数参数限制的字符串。随着each的增加,打印的点数将从零变为三。空格将“擦除”先前的点,而退格\b将擦除空格。
在Linux上,我使用sleep而不是DelayMS

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

int main( void) {
    for ( int loop = 0; loop < 4; ++loop) {
        for ( int each = 0; each < 4; ++each) {
            printf ( "\rloading%.*s   \b\b\b", each, "...");
            fflush ( stdout);//force printing as no newline in output
            sleep ( 1);
        }
    }
    printf ( "\n");
    return 0;
}

答案 1 :(得分:0)

要重置线路时,请尝试以下printf("\rListening") 代替

PRINTF("\r>>             ");
PRINTF("\r");

应该是:

while(condition to stop this animation){
printf("Listening");
    for(int i=0; i<3; i++){
        delay(500);
        printf(".");
    }
 printf("\r");
}