【问题标题】:how to get rid off garbage in array of chars?如何摆脱字符数组中的垃圾?
【发布时间】:2010-03-19 06:21:03
【问题描述】:

我正在编写一个 C 程序,但我的字符数组一直有问题。当我使用prinf打印它时,我不断收到垃圾。这是我打印时得到的一个示例:

t.symbol 处的字符是 Aôÿ¿
tabl[0].symbol 处的字符是 A
tabl[1].symbol 处的 char 是一个
tabl[2].symbol 处的 char 是一个
tabl[3].symbol 处的字符是 d
tabl[4].symbol 处的字符是 e
tabl[5].symbol 处的字符是 f
tabl[6].symbol 处的字符是 g
tabl[7].symbol 处的字符是 h
tabl[8].symbol 处的字符是 i
tabl[9].symbol 处的字符是 x
t[0].symbol 处的字符是 a0AÃ
t[1].symbol 处的字符是 b)@Ã4
t[2].symbol 处的字符是 ckU*
t[3].symbol 处的字符是 Aôÿ¿
t[4].symbol 处的字符是

有人能告诉我如何摆脱字符数组中的垃圾吗?

这是我的代码

#define MAX 100
#ifndef SYMBSIZE
 #define SYMBSIZE 1
#endif    

typedef struct tableme 
{
    char symbol[SYMBSIZE];
    int value;
    int casenmbr;
    int otherinfo;
}tabletype;
int main(int argc, char **argv)
{
    tabletype t[MAX];
    t[3].symbol[0] = 'A';

    t[0].value=1;  
    t[0].casenmbr = 7;
    t[0].otherinfo = 682;

    tabletype tabl[MAX];
    tabl[0].value = 1;
    tabl[0].symbol[0] = 'A';
    tabl[1].value = 11;
    tabl[1].symbol[0]= 'a';
    tabl[2].value = 12;
    tabl[2].symbol[0] = 'a';
    tabl[3].value = 13;
    tabl[3].symbol[0] = 'd';
    tabl[4].value = 14;
    tabl[4].symbol[0] = 'e';
    tabl[5].value = 15;
    tabl[5].symbol[0] = 'f';
    tabl[6].value = 16;  
    tabl[6].symbol[0] = 'g';
    tabl[7].value = 17;
    tabl[7].symbol[0] = 'h';
    tabl[8].symbol[0] = 'i';
    tabl[9].symbol[0] = 'x';
    t[1].symbol[0] = 'b';
    t[0].symbol[0]= 'a';
    t[2].symbol[0]= 'c';

    t[4].symbol[0]= 'g';
    printf("char at t.symbol is %s \n", t[3].symbol);

    for( x=0;x<10;x++)
    {
            printf("char at tabl[%d].symbol is %s \n",x, tabl[x].symbol);
    }
    int j;
    for(j = 0; j<5;j++)  
    {
            printf("char at t[%d].symbol is %s \n",j, t[j].symbol);
    }
    return 0;
}

【问题讨论】:

    标签: c arrays char garbage


    【解决方案1】:

    您有两个可能的问题之一。如果您真的只想要一个字符,您应该使用%c 打印它,而不是像这样使用%s

    printf("char at t.symbol is %c \n", t[3].symbol[0]);
    

    如果你真的想要字符串,你必须将 SYMBSIZE 定义为比符号的最大长度高 1 并在末尾放置一个 NUL (\0) 字符。您可以通过以下几种方式做到这一点:

    1. tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
    2. strcpy(tabl[6].symbol, "g");

    【讨论】:

    • 作为 gabe 所说的扩展,当您尝试打印为字符串时得到额外的乱码的原因是因为您的数组未初始化。您看到的乱码是分配数组时碰巧在数组使用的内存中的垃圾。
    【解决方案2】:

    问题是 C 中的字符串是空终止的。但是,您的数组仅够容纳一个字符,因此不能以空字符结尾(这需要至少 2 个字符)

    你为什么会得到垃圾?当你说tabl[0].symbol[0] = 'A'; 时,在内存中的tabl[0].symbol[0] 你有A???,我们不知道??? 是什么。显然,它有时是 0(你得到正确的输出),有时不是(垃圾)。

    要解决此问题,请使用%c 格式说明符打印单个字符而不是以空字符结尾的字符串。如果你真的想打印字符串,你需要让你的字符串缓冲区更大并且空终止它:

    SYMBSIZE = 10,然后有tabl[0].symbol[1] = '\0'; 注意,你通常要使用字符串函数:

    // copy "a" to that memory location, will be null-terminated.
    strcpy(tabl[0].symbol, "a"); 
    

    如果你的缓冲区对于字符串来说不够大,它将超出缓冲区。

    【讨论】:

    • GMan 我尝试使用 strcpy 但遇到分段错误,但我明白了。我只是将 '\0' 放在字符串的末尾,垃圾就消失了。谢谢你的帮助
    • 需要将参数切换为strcpy
    【解决方案3】:

    您的数组不够大,无法存储字符串。您需要为空字符留出额外的空间。将 SYMBSIZE 更改为 2 或将其打印为字符。任何一个都应该工作。

    编辑:另外,无论如何您都没有放入空字符。将继续打印字符串,直到它到达 \0,因此您需要先创建 SYMBSIZE = 2,然后再创建 symbol[1] = '\0'; 才能打印为字符串。

    EDIT2:或者只是将您的%s 更改为%c(一次打印一个字符而不是整个字符串)

    【讨论】:

      【解决方案4】:

      要打印出一个字符,您应该在 printf 中使用 %c。

         printf("char at t.symbol is %c \n", t[3].symbol);
      

      您的编译器应该警告您格式字符串与传递的值不匹配。 编译器警告是有原因的。

      【讨论】:

        【解决方案5】:

        如果你想要字符,那么你需要使用 %c 而不是 %s 来打印字符。

        printf("char at tabl[%d].symbol is %c \n",x, tabl[x].symbol);
        

        【讨论】:

          【解决方案6】:

          有办法解决问题。基本上,一旦我们初始化了 char 数组,我们就必须用垃圾值覆盖它为 NUll。 enter code here

          void main()
          {
              int amsb[10];
              int i,k,i1;
              char arr[25];
              clrscr();
              printf("Enter the 10 element");
          
              for( i1=0;i1<25;i1++) {
                  arr[i1]='\0';
              }
          
              for( k=0;k<25;k++) {
                  printf("%c",arr[k]) ;
          
                  if(arr[k]=='\0')  {
                      break;                
                  }
              }
          
              getch();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-10-24
            • 1970-01-01
            • 2010-11-25
            • 1970-01-01
            • 1970-01-01
            • 2015-06-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多