如何摆脱阵列中的垃圾?

时间:2010-03-19 06:21:03

标签: c arrays char garbage

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

来自t.symbol的char Aôÿ¿
tab at tabl [0] .symbol是A
tab at tabl [1] .symbol是一个 tab at tabl [2] .symbol是一个 tab at tabl [3] .symbol是d
tab at tabl [4] .symbol是e
tab at tabl [5] .symbol是f
tab at tabl [6] .symbol是g
tab at tabl [7] .symbol是h
tab at tabl [8] .symbol是我 tab at tabl [9] .symbol是x
字符t [0] .symbol a0AÃ
char [1] .symbol b)@Ã4
char at t [2] .symbol ckU *
char at t [3] .symbol Aôÿ¿
char at 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;
}

6 个答案:

答案 0 :(得分:4)

您有两个可能的问题之一。如果你真的只想要一个角色,你应该用%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");

答案 1 :(得分:3)

问题是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"); 

如果你的缓冲区不足以容纳字符串,它将超出缓冲区。

答案 2 :(得分:2)

您的数组不足以存储字符串。您需要为空字符添加额外空间。将SYMBSIZE更改为2或将其作为char打印。任何一个都应该工作。

编辑:此外,你还没有把空字符加入。打印字符串将一直持续到达\ 0,因此您需要制作SYMBSIZE = 2然后制作symbol[1] = '\0';才能以字符串形式打印。

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

有一种方法可以解决问题。基本上,一旦我们初始化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();
}