void main(){
char s[10];
s[1]='a';
s[6]='4';
for(int i=0;i<10;i++)
printf("%c",s[i]);
}
我有这个简单的程序。它给出以下输出:
@aO 4
如果我将上面的代码更改为:
void main(){
char s[10];
s[1]='a';
s[6]='4';
for(int i=0;i<10;i++)
printf("%c",s[i]);
printf("\n");
for(int i=0;i<10;i++)
printf("%c",s[i]);
}
输出更改为:
@a@ 4
@a@ 4
实际上有2个多维数据集,其中a和a之间有4个数字(每个象限中的每个象限为1个数字),但由于某些原因它们未显示。请尝试在代码块中使用上述代码,如果我对你没有意义。
我期望第一个代码的输出为a 4
。为什么不是这样?另外,为什么当我添加更多代码时输出发生变化?我期望的输出是:
a 4
a 4
答案 0 :(得分:2)
问题是您没有初始化数组。为了获得该输出,您可以采用以下方式:
char s[10];
for(int i=0;i<10;i++)
{
s[i] = ' ';
}
s[1]='a';
s[6]='4';
for(int i=0;i<10;i++)
printf("%c",s[i]);
答案 1 :(得分:2)
这里
App Store Distribution
字符数组char s[10]; /* uninitialized array */
未初始化,默认的s
元素包含垃圾数据,因为它具有自动存储持续时间,并且您仅将值分配给了s
和s[1]
。
因此s[6]
和s[1]
之外的数组元素包含垃圾数据,并且每次打印都不能保证它们的值相同。
为避免这种情况,您可以像这样初始化数组
s[6]
同时声明自己。
答案 2 :(得分:1)
您必须了解程序背后的行为。因此,当您加载程序时,会在内存中为N
个字节提供该字节,并且N
个字节将被多次重用并且不会被擦除。因此,在第一个实例中,您的程序已将一些数据加载到稍后将s[0]
驻留的位置,在第二个位置还将数据加载到s[2]
的位置。这就是为什么在这两种情况下您得到不同的输出的原因。
因此,可以总结一下:除非您自己进行操作,否则不会将数组初始化为0
或,只有相同程序才能使用该内存。按照您的指示进行操作,然后再执行以下操作:
char s[10] = " ";
....
我看到的另一件事是,您不希望在a
之前出现空格,因为C / C ++ / Java数组索引从0
开始。因此,如果您这样做:
char s[4];
s[1] = 'a';
s[2] = 'b';
s[3] = '\0';
print ("%s", s);
您可能会得到:
@ab
@
之所以出现,是因为您在s[0]
所在的内存位置没有写任何作为程序员的内容。
请注意,每次在C
中使用字符串时,都必须以'\ 0'字符终止。