如何从C中删除控制台输出中的字符

时间:2013-12-06 14:33:48

标签: c optimization console character output

代码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;
}

Code1的输出:

0 1 2 3 
4 5 6 7 

Code1备注:

  1. 3 7
  2. 之后的空格
  3. 7 之后的换行符(Stackoverflow已将其删除)
  4. 代码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;
    }
    

    Code2的输出:

    0 1 2 3
    4 5 6 7
    

    Code2的评论:

    1. 3 7
    2. 之后没有空格
    3. 7
    4. 后没有换行符

      Code2的补充说明:

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

      CODE3

      #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. 如果不清楚,请编辑问题。
      3. 编辑 我不知道为什么我的问题没有用处或建设性。虽然以上是一个随意的小例子,但在处理大量数据时性能可能是一个问题。我认为从控制台输出中删除字符的方法可能会提高性能,并且可能有一种特定的方法。这就是我问这个问题的原因。我可以在答案中写下以下代码。现在我通过注释知道从控制台输出中删除字符是不可能的,因为它取决于实现。

4 个答案:

答案 0 :(得分: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语句 - 你只是在结尾处没有打印换行符line(因为它将在开始时打印...)

执行此操作的方法稍微有点根本不涉及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"在打印输出中显示事情的行为符合预期。

如果不对条件进行额外评估,它会按照您的要求进行。它更具可读性吗?不是......

答案 1 :(得分:0)

如果它真的困扰你,你可以稍微展开你的循环,以便将最后一项视为一个特例:

#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;
}

答案 2 :(得分:0)

#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 ;
}

答案 3 :(得分:0)

嗯,试着回答你的问题,我就是这样做的:

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.