题
我正在编写一个 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
) 字符结尾。您可以通过几种方式做到这一点:
tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
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();
}