【问题标题】:How to remove characters from console output in C如何从 C 中的控制台输出中删除字符
【发布时间】:2013-12-06 14:33:48
【问题描述】:

代码1:

#include<stdio.h>
int main()
{
    unsigned short i, j, k;
    for (i = 0; i < 2; i++)
    {
        k = i * 4 + 4;

        for (j = k - 4; j < k; j++)
            printf("%hu ", j);

        putchar('\n');
    }

    return 0;
}

代码 1 的输出:

0 1 2 3 
4 5 6 7 

Code1备注:

  1. 37 之后的空格
  2. 7 之后的换行符 (Stackoverflow 已将其删除)

代码2:

#include<stdio.h>
int main()
{
    unsigned short i, j, k;
    for (i = 0; i < 2; i++)
    {
        k = i * 4 + 4;
        for (j = k - 4; j < k; j++)
        {
            printf("%hu", j);

            if (j + 1 != k) putchar(' ');
        }

        if (i + 1 != 2) putchar('\n');
    }

    return 0;
}

代码2的输出:

0 1 2 3
4 5 6 7

Code2备注:

  1. 37 后面没有空格
  2. 7 之后没有换行符

Code2补充说明:

Code2 的问题是算法总是比较 if 块中的两个值,因此 Code2 效率不高。我想使用 Code1 并更改这些:

代码3

#include<stdio.h>
int main()
{
    unsigned short i, j, k;
    for (i = 0; i < 2; i++)
    {
        k = i * 4 + 4;

        for (j = k - 4; j < k; j++)
            printf("%hu ", j);

        printf("\b\n");
    }

    putchar('\b');
    return 0;
}

这些不显示 Code2 的相同输出,因为 \b 不会删除任何内容。

我的问题:

我在 Code3 中尝试过的有什么标准方法吗?

我的问题的备注:

  1. 我已经搜索了互联网,但没有确定解决方案。
  2. 如果不清楚,请编辑问题。

编辑: 我不知道为什么我的问题没有用或没有建设性。虽然上面是一个任意的小例子,但是在处理大量数据时性能可能是一个问题。我认为从控制台输出中删除字符的方法可能会提高性能,并且可能有一种特定的方法可以做到这一点。这就是我问这个问题的原因。我可以在答案中写下以下代码。现在我通过 cmets 知道从控制台输出中删除字符是不可能的,因为它依赖于实现。

【问题讨论】:

  • 问题不清楚:你的目标是输出代码 2 吗?如果是这样,为什么不以一种不放置'\n'和你不需要的空格字符的方式组织代码呢?
  • 第 1 课:'\b' 只是发送到标准输出的一个字节。如果您的标准输出碰巧到达终端,终端可能会通过向后移动插入符号来响应(就像通过将插入符号向前移动几次来响应 '\t' 一样)。或者终端可能不会。这取决于实施。第2课:请不要过早优化!在ifs 中的任何时间输出字符到终端 DWARFS 的过程。

标签: c optimization console character output


【解决方案1】:

通常的做法是将第一个或最后一个printf 视为特殊情况(循环外):

for(ii=0; ii<2; ii++) {
  jj = 0;
  printf("%d", jj);      // first number printed without space.
  for(jj=1; jj<4; jj++) {
    printf(" %d", jj);   // include the space before the number printed
  }
  if(ii<2-1) printf("\n");
}

显然,为了简单起见,我简化了循环的构造方式和打印内容。你可以做第一个printf 声明

printf("\n%d", jj);

然后您在输出的开头有一个换行符(通常是一件好事),然后您就不需要if 语句 - 您只是没有在行尾打印换行符(因为它将在开始时打印...)

有一些更有效的方法可以做到这一点,根本不需要if 语句 - 但这些都是以降低可读性为代价的。例如,下面是“无循环展开且无额外 if 语句”版本的代码:

http://codepad.org/01qPPtee

#include <stdio.h>
int main(void) {
int ii, jj;
   ii = 0;
   while(1) {
      jj = 0;
      while(1) {
        printf("%d", jj);   // include the space before the number printed
        jj++;
        if(jj<4) printf("."); else break;
      }
      ii++;
      if(ii<2) printf("*\n"); else break;
    }
return 0;
}

输出:

0.1.2.3*
0.1.2.3

基本上我已经采用了for 循环的功能并将其明确化;我还使用. 而不是"*\n" 而不是"\n" 在打印输出中显示事情的行为符合预期。

它会按照您的要求执行,而无需对条件进行额外评估。它更具可读性吗?不是真的……

【讨论】:

  • 您的第二个代码虽然可读性较差,但效率很高。我可以制作我问题答案的所有代码。我想知道是否有任何标准方法可以从控制台输出中删除我在 Code3 中尝试过的最后一个字符?
  • @arnobpl - 不幸的是,“从控制台输出中删除字符”取决于实现 - 所以不能保证“退格和删除”。我怀疑这是电传打字时代的遗留物——一旦角色出现在纸上,你可以退格覆盖,但你不能删除它。请参阅 Arkadiy 的评论。您可能对您提出的问题感兴趣:stackoverflow.com/questions/20428158/…
【解决方案2】:

如果它真的让您感到困扰,您可以稍微展开循环,以便将最后一项视为特殊情况:

#include<stdio.h>
int main()
{
    unsigned short i, j, k;
    for (i = 0; i < 1; i++)
    {
        k = i * 4 + 4;
        for (j = k - 4; j < k - 1; j++)
        {
            printf("%hu ", j);
        }
        printf("%hu\n", j);
    }

    k = i * 4 + 4;
    for (j = k - 4; j < k - 1; j++)
    {
        printf("%hu ", j);
    }
    printf("%hu", j);

    return 0;
}

【讨论】:

  • 你的代码效率高但是代码比较大。是否有任何标准方法只是从控制台输出中删除我在 Code3 中尝试过的最后一个字符?
【解决方案3】:
#include <stdio.h>

int main(){
    unsigned short num = 0, to=8;

    while(num < to){
        printf("%hu", num++);
        if(num < to)
            putchar(num % 4 == 0 ? '\n' : ' ');
    }
#if 0
    do{
        printf("%hu", num++);
    }while(num < to && putchar(num % 4 == 0 ? '\n' : ' '));
#endif
    return 0 ;
}

【讨论】:

  • 我觉得应该不会说是标准的方式吧 所以如果你怎么写喜欢评论说你发现最后的值是不是因为重叠了。
【解决方案4】:

好吧,为了回答你的问题,我会这样做:

for (i = k = 0; i < 2; i++){
  if (i > 0) printf("\n");
  for (j = 0; j < 4; j++, k++){
    if (j > 0) printf(" ");
    printf("%d", k);
  }
}

我这样做是因为我想确保除了第一行以外的每一行都以\n 开头,并且每个项目都由一个空格隔开。 此外,我不希望行和列位置与正在打印的内容密切相关。

在性能方面,请记住,这些if 语句大约需要 1 个周期,而打印的每个字符至少要花费数百甚至数千。 printf 通过多层系统调用来解释其格式字符串,构建缓冲区,将缓冲区发送到系统 I/O 例程,然后导致控制台窗口的重新绘制和滚动。明白了吗?

除非您知道自己有问题,否则不要担心性能。 然后,不要猜测。使用诊断。 Here's what I do.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多