C 关于打印的问题:显示反映更改的值

C 关于打印的问题:显示反映更改的值,c,formatting,cursor-position,C,Formatting,Cursor Position,我有一些关于在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;

我有一些关于在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
的变化

我是说,如果目前的情况是

结果窗口

2
3
2
3
若我给Button=1,我希望结果是

结果窗口

2
3
2
3
不是

结果窗口

2
3
2
3
所以我找到了一些代码来实现这一点,但当计数超过10并返回到一位数(0~9)时, 结果表明


10到90,而不是09。也不是08而是80。如何处理此问题?

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

  • 要从光标位置删除该行,请执行以下操作: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("\033[%dD\033[K", 2);
    
  } while(1);

  return 0;
}
#包括
#包括
内部主(空)
{
整数计数=0;
做{
printf(“%d”,计数);
fflush(stdout);
睡眠(1);
计数=(计数+1)%20;
//向后移动两列并删除该行
//(033是ESC的八进制ASCII码)
printf(“\033[%dD\033[K],2);
}而(1),;
返回0;
}

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

  • 要从光标位置删除该行,请执行以下操作: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("\033[%dD\033[K", 2);
    
  } while(1);

  return 0;
}
#包括
#包括
内部主(空)
{
整数计数=0;
做{
printf(“%d”,计数);
fflush(stdout);
睡眠(1);
计数=(计数+1)%20;
//向后移动两列并删除该行
//(033是ESC的八进制ASCII码)
printf(“\033[%dD\033[K],2);
}而(1),;
返回0;
}

您可以用空格覆盖剩菜,如下所示:

printf("YOUR TIME : %d \r", i);
您是否看到
%d
\r
之间的空格字符

一些注意事项:

  • 您已经有
    %02d
    ,但这与您对错误输出的描述不匹配
  • 我会将
    \r
    放在格式字符串的开头,因为我觉得这更符合逻辑
  • 如果在循环完成后,输出将被另一个文本覆盖,我会将
    \r
    保留在现在的位置,并且
    printf(“finished\n”);
    put(“finished”);
    保留足够的空间

您可以用空格覆盖剩菜,如下所示:

printf("YOUR TIME : %d \r", i);
您是否看到
%d
\r
之间的空格字符

一些注意事项:

  • 您已经有
    %02d
    ,但这与您对错误输出的描述不匹配
  • 我会将
    \r
    放在格式字符串的开头,因为我觉得这更符合逻辑
  • 如果在循环完成后,输出将被另一个文本覆盖,我会将
    \r
    保留在现在的位置,并且
    printf(“finished\n”);
    put(“finished”);
    保留足够的空间
printf(“%d\r”,count);
=>
printf(“%02d\r”,count);
02
意味着格式化最小字段宽度为2个字符,并在左侧填充
0
而不是空格。这将覆盖以前的2个字符输出。
printf(%-8d\r,count);
将使用系统(“cls”)在打印count之前,您需要做什么?@VisakhVijayan:system()非常繁重,因为它会启动一个shell来执行请求的命令。因此,屏幕上的每次更改都会启动至少两个子进程。这是不合理的。
printf(“%d\r”,count);
=>printf(“%02d\r”,count)。
02
意味着格式化最小2个字符的字段宽度,并用
0
代替空格。这将覆盖以前的2个字符输出。
printf(“%-8d\r”,count);
在打印计数之前使用系统(“cls”)对您有效吗?@VisakhVijayan:system()因为它会启动一个shell来执行请求的命令,所以在屏幕上的每次更改都会启动至少两个子进程。这是不合理的。