2

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

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

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

这是我的代码

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

6 回答 6

4

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

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

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

  1. tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
  2. strcpy(tabl[6].symbol, "g");
于 2010-03-19T06:31:11.213 回答
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"); 

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

于 2010-03-19T06:30:21.480 回答
2

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

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

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

于 2010-03-19T06:25:42.663 回答
2

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

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

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

于 2010-03-19T06:28:47.613 回答
2

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

printf("char at tabl[%d].symbol is %c \n",x, tabl[x].symbol);
于 2010-03-19T07:59:25.303 回答
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();
}
于 2016-02-03T08:58:59.497 回答