关于打印的问题:显示值反映变化

Question about printing: displaying value reflecting change

我有一些关于在 C 上打印的问题。这是我的代码。

while(1)
{
    if(Button == 32)
    {
        break;
    }
        else
    {
        if(Button == 1)
            count += 1;
        if(btn_value == 2)
            count -= 1;
        if(btn_value == 4)
            count = 0;

        printf("%d\r", count);
        fflush(stdout);
    }
}


for (int i=count;i>=0 ; i--)
{
    printf ("YOUR TIME : %02d\r", i);
    fflush(stdout);
    sleep(1);
}

这是我的主要代码的一部分。我设计的是接收按钮输入并相应地改变计数的值。我想要做的是在一行中显示 count 的值,连续反映 count.

的变化

我的意思是,如果现在的情况是

结果window

2

如果我给 Button = 1,我希望结果是

结果window

3

没有

结果window

2
3

所以我找到了一些代码来执行此操作但是当计数超过 10 并且 return 回到一位数字 (0~9) 时, 结果显示

10 到 90,不是 09。也不是 08,而是 80。我该如何处理?

如果输出终端支持它们,则可以使用所提供的 ANSI 转义序列 here。例如:

  • 从光标位置擦除行:ESC[K
  • 使光标向后移动N列:ESC[ND

这是一个小示例程序,每秒钟在同一位置显示一个从 0 到 19 的计数器:

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

int main(void)
{
  int count = 0;

  do {

    printf("%d", count);
    fflush(stdout);

    sleep(1);
    count = (count + 1) % 20;

    // Go 2 columns backward + Erase the line
    // (033 is the octal ASCII code of ESC)
    printf("3[%dD3[K", 2);
    
  } while(1);

  return 0;
}

您可以用 spaces 覆盖剩余部分,如下所示:

printf("YOUR TIME : %d \r", i);

你看到 %d\r 之间的 space 字符了吗?

一些注意事项:

  • 您已经有%02d,但这与您描述的错误输出不符。
  • 我会把 \r 放在格式字符串的开头,因为这对我来说更合乎逻辑。
  • 如果在循环结束后输出将被另一个文本覆盖,我会保留 \r 现在的位置,并且 printf("FINISHED \n");puts("FINISHED "); 有足够的 spaces.