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

t.symbol 处的字符是 奥伊科
tabl[0].symbol 处的字符是 A
table[1].symbol 处的 char 是
tabl[2].symbol 处的 char 是
table[3].symbol 处的字符为 d
table[4].symbol 处的字符是 e
table[5].symbol 处的字符为 f
table[6].symbol 处的字符为 g
table[7].symbol 处的字符为 h
table[8].symbol 处的字符是 i
table[9].symbol 处的字符为 x
t[0].symbol 处的字符是 α0Aα
t[1].symbol 处的 char 是 b)@à4
t[2].symbol 处的 char 是 CKU*
t[3].symbol 处的 char 是 奥伊科
t[4].symbol 处的 char 是

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

这是我的代码

#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, , 不是 %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");

其他提示

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

如果您的缓冲区不够大的字符串,它会溢出缓冲区。

您的数组是没有大到足以在商店的字符串。您需要为空字符的额外空间。更改SYMBSIZE 2或打印的字符。任一个应该工作。

编辑:另外,你不把空字符,无论如何。打印字符串会继续下去,直到它碰到\ 0,所以你需要做SYMBSIZE = 2,然后作出symbol[1] = '\0';以打印为一个字符串。

EDIT2:或者只是改变你的%s%c(在一个时间,而不是整个字符串打印单个字符)

要打印出应该使用%C在printf的一个字符。

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

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

如果你想要的字符,然后你需要使用%C,而不是%s到打印的字符。

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

有是解决该问题的一种方式。基本上,一旦我们初始化字符数组,所以我们必须用垃圾值设置为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();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top