在C中打印char数组

时间:2018-12-25 18:56:54

标签: c arrays char

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

3 个答案:

答案 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元素包含垃圾数据,因为它具有自动存储持续时间,并且您仅将值分配给了ss[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'字符终止。