【问题标题】:output many chars (including ASCII) at once?一次输出许多字符(包括ASCII)?
【发布时间】:2016-03-24 09:17:17
【问题描述】:

伙计们,我正在开发一个需要输出二维int 数组的程序(我将其设为int-array,因为我在其他点使用这些值)。在我的第一次尝试中,我尝试为 int 值打印正确的字符(包括 ASCII):

void printField(){                              
    int i,j;
    system("CLS");
    for(i=0; i<52; i++) {
       for(j=0; j<142; j++) {
            if(field[i][j]==0){
                printf(" ");                    
            }
            if(field[i][j]==9){
                printf("%c",219);                       
            }
            if(field[i][j]==2){ 
                printf("%c",219);                   
            }
            if(field[i][j]==1){
                printf(" ");                    
            }
            if(field[i][j]==6){
                printf(" ");                    
            }
            if(field[i][j]==7){
                printf("%c",207);               
       }
       printf("\n");
   }
}

问题是,屏幕在闪烁,因为我必须非常快地打印该字段,并且它会一个接一个地打印一个字符。所以我开始研究(herehere 可能会有所帮助)并尝试通过一次打印出来来解决这个问题(使用strcat()):

void printField(){                              
    int i,j;
    char toPrint[10000];
    system("CLS");
    for(i=0; i<52; i++) {
       for(j=0; j<142; j++) {
            if(field[i][j]==0){
                strcat(toPrint," ");                    
            }
            if(field[i][j]==9){
                char temp[2];
                temp[0]=char(219);
                strcat(toPrint,temp);               
            }
            if(field[i][j]==2){
                char temp[2];
                temp[0]=char(219);
                strcat(toPrint,temp);               
            }
            if(field[i][j]==1){
                strcat(toPrint," ");                    
            }
            if(field[i][j]==6){
                strcat(toPrint," ");                    
            }
            if(field[i][j]==7){
                char temp[2];
                temp[0]=char(207);
                strcat(toPrint,temp);               
            }
       }
       strcat(toPrint,"\n");
   }
   printf("%s\n", toPrint);
}

使用 DEV-C++ 我没有收到任何错误,但输出完全不是应有的。有什么想法吗?

【问题讨论】:

  • 输出是什么?应该是什么输出?
  • 还可以在循环之前尝试在 toPrint 数组上使用函数 memset(),因为该数组中可能仍有垃圾字符。
  • 如果你把它变成char的数组,你仍然可以使用这些值。打印时,它会让您的生活更轻松。
  • ASCII 字符的编码从 0 到 127。
  • strcat 要求第一个参数是有效的、以空字符结尾的字符串。你传递了一个充满垃圾的缓冲区。通过初始化 char toPrint[n] = ""; 来解决这个问题。还要避免在堆栈上转储 10k 字节,否则可能会导致堆栈溢出。

标签: c arrays char output


【解决方案1】:

试试这个:

void printField()
{
    int i,j;
    int n = 0;
    char toPrint[52*(142+1)+1];

    system("CLS");

    for (i=0; i<52; i++)
    {
        for (j=0; j<142; j++)
        {
            switch (field[i][j])
            {
                case 0: toPrint[n++] = ' '; break;
                case 9: toPrint[n++] = 219; break;
                case 2: toPrint[n++] = 219; break;
                case 1: toPrint[n++] = ' '; break;
                case 6: toPrint[n++] = ' '; break;
                case 7: toPrint[n++] = 207; break;
            }
        }
        toPrint[n++] = '\n';
    }

    toPrint[n] = '\0';
    printf("%s\n",toPrint);
}

【讨论】:

  • 也有效(即使使用正确的字符)。所以解决方案是在没有strcat() 的情况下手动连接这些字符?另一个问题:'\n' 和 '\0' 是 chararray 中的 one 字符,对吧?这对尺寸意味着什么? toPrint[53*142+1]
  • @Wondertree: 1. strcat 将两个以空字符结尾的字符串(以'\0' 结尾的字符数组)作为输入参数。在您的代码中,您提供了一个符合该要求的参数,从而导致未定义的行为(很可能是内存访问冲突或读取/写入“垃圾”数据)。 2. 是的,'\n''\0' 各是 一个 字符。 3.toPrint[52*142+1] 表示toPrint 数组由 52*142+1 个条目组成,这正是您的情况所需的确切数量。
  • 啊好吧,拿到第一个,但我还是想知道尺寸。如果我在每 52 个字符后有 52*142 个字符 + '\n' + '\0' 最后,那不应该是 [53*142+1] 吗?
  • @Wondertree:你说得对。我已将其更改为 52*(142+1)+1
【解决方案2】:

对不起,你的代码有很多错误,所以我不得不重写它:

void printField(){                              
    int i,j;
    char toPrint[10000];
    char* current = toPrint; // pointer to beginning of char array
    system("CLS");
    for(i=0; i<52; i++) {
       for(j=0; j<142; j++) {
            if(field[i][j]==0){
                *current++ = ' ';
            }
            if(field[i][j]==9){
                *current++ = '\xDB';
            }
            if(field[i][j]==2){
                *current++ = '\xDB';
            }
            if(field[i][j]==1){
                *current++ = ' ';
            }
            if(field[i][j]==6){
                *current++ = ' ';
            }
            if(field[i][j]==7){
                *current++ = '\xCF';
            }
       }
       *current++ = '\n';
   }
   *current = '\0';
   puts(toPrint);
}

编辑:修正了错误的字符

【讨论】:

  • 谢谢,工作几乎完美(我得到其他字符)。我不习惯使用指针,但到目前为止还是有意义的。不过,如果您能解释为什么我的版本不起作用,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2013-02-07
  • 2011-11-22
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多