字符串打印疑惑,请达人指点
如下小程序:
#include <stdio.h>
main()
{
char str[10] = {0};
int i = 0;
for(i=0;i <10;i++)
str[i] = '0 ' + i;
for(i=0;i <10;i++)
printf( "%c\n ", str[i]);
printf( "%s\n ", str);
}
声明: 1. 此程序依次给str[0]...str[9] 赋值字符0...9. 分两次打印。但是结果出我所料。结果如下:
0
1
。。。
9
012345678
2。 使用gcc 3.4, Redhat EL4,
疑惑:为什么用字符串打印方式,第10个字符9,变成了乱码,我知道打印字符串的时候,打印到‘\0’为止,所以打印结果是未知的,但是为什么已知的str[9]会发生变化?
[解决办法]
char str[10] = {0};
==》
char str[11] = {0};
[解决办法]
因为你的空间不足。
%s 输出时候遇到 \0 结束,
但是 char str[10] = {0}; 的话,末尾没有\0,导致乱码。
[解决办法]
在VS2005下并没有此问题
重新编译
[解决办法]
既然明知有错,为何不改
[解决办法]
你定义的是char str[10];你的意思是说str存储十个字符。str[0]=0,...,str[9]=9;
这点你做到了 。
而你printf( "%s ",str)时, 它是找 '\0 '结束,而在你的数组中最后一个是str[9]=9.所以你用%s输出是不对的。
不管printf( "%s ",str) 是0123456789还是012345678都是不对的。根据机器和编译器的具体情况而定。
[解决办法]
#include <stdio.h>
main()
{
char str[10] = {0};
int i = 0;
for(i=0;i <10;i++)
str[i] = '0 ' + i;
for(i=0;i <10;i++)
printf( "%c\n ", str[i]);
str[i]=0;
printf( "%s\n ", str);
}