我正在写一个C程序,但我的字符数组一直存在问题。当我使用prinf打印它时,我一直在变垃圾。这是我打印时得到的一个例子:
来自t.symbol的char 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;
}
答案 0 :(得分:4)
您有两个可能的问题之一。如果你真的只想要一个角色,你应该用%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");
答案 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();
}