C语言中用标准输出函数打印 char s1[]={'q','w'};出现乱码,若将数组长度定义为大于等于3就不会乱码。为啥

C语言中不是字符串数组才需要长度比有效字符数多1才可以正常输出吗,为啥字符数组也要这样,用的是C++6.0,只有将是s1定义比3大(因为原来有两个字符qw,长度为2)才能正常打印,为什么呢?

如果你定义的字符数组等于或小于你想存放字符数的长度,那么C不会将'\0'字符放入你所放入字符串后面(因为已经没有地方放了),如果你想将放入的字符作为一个字符串使用,s1至少要留一个位置放将'\0',如果你输出s1指向的字符串,C将会输出字符直到碰到将'\0'字符,'\0'字符到底是什么时候出现是不可预知的(这要看内存里到底是神东西了呵呵),当然,在碰到将'\0'字符前肯定会输出内存中一些不可预知的东西,所以会输出如你图中所示的乱码。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-17
最后一个元素设置为'\0'即可。printf %s的时候遇到'\0'才终止。你这个数组里面没有'\0',printf便一直往下面打印直到遇到'\0'才停止。所以会出现乱码。
有问题,多调试。本回答被网友采纳
第2个回答  2014-08-26

你这样写是不正确的 

//vc6.0调试下


char s1[]={'q','w'};   //错误

char s1[]={'q','w','\0'}; // 正确的

char s1[3]={'q','w'}; //正确的

char s1[]="qw";//正确的,这种格式下 系统自动  加 \0


把 谭浩强 的那段说明  仔细看看


# include <stdio.h>
int main (void)
{ char s1[]={'q','w'};   //错误
char s2[]={'q','w','\0'}; // 正确的
char s3[3]={'q','w'}; //正确的
char s4[]="qw";//正确的,这种格式下 系统自动  加 \0

printf("%s\n%s\n%s\n%s\n",s1,s2,s3,s4);  

}


可以尝试用

putchar(s1[0]);

putchar(s1[1]);   //正常输出 qw

第3个回答  2012-08-17
数组没有字符结束符‘\0',不能用%s输出的。因为%s是以\0为结束符的。
相似回答