比如初始化 char a[5]={a,b,c,d,e}; 而实际上系统要给字符数组加终止符\0来判断字符数组什么时候结束,也就是应该初始化为 char a[6]={a,b,c,d,e};对不对?最后空一个位置给系统加\0
课本上说字符数组长度要大于实际长度,但在有些例题中课本自己将实际长度定义的跟有效长度相等。
不对
首先 初始化字符串 有 char a[5]={'a','b','c','d','e'}; 这种方式
还有 char a[5] ="abcd";这种方式 后者才会自动添加结束符
前者不会
至于char a[5]={'a','b','c','d','e'}; 这种对不对
这个是根据实际使用情况决定的
不是说没加结束符就一定不对
举个例子
例如 ip地址是4个unsigned char存储的
就可以申请 char ip[4] ={192,168,1,111};
这样并没有什么问题
而如果你是要存储一个字符串 然后用来输出的话
char a[5]={'a','b','c','d','e'}; 这样初始化的结果就是
printf("%s",a);
输出结果是 abcde#¥……&*后面一堆乱码
因为要输出到遇到结束符停止,至于第几个是结束符就看运气了
所以如果用于字符串的话 char a[5]={'a','b','c','d','e'}; 正确的应该是
char a[6]={'a','b','c','d','e','\0'};
首先 初始化字符串 有 char a[5]={'a','b','c','d','e'}; 这种方式
还有 char a[5] ="abcd";这种方式 后者才会自动添加结束符
前者不会
至于char a[5]={'a','b','c','d','e'}; 这种对不对
这个是根据实际使用情况决定的
不是说没加结束符就一定不对
举个例子
例如 ip地址是4个unsigned char存储的
就可以申请 char ip[4] ={192,168,1,111};
这样并没有什么问题
而如果你是要存储一个字符串 然后用来输出的话
char a[5]={'a','b','c','d','e'}; 这样初始化的结果就是
printf("%s",a);
输出结果是 abcde#¥……&*后面一堆乱码
因为要输出到遇到结束符停止,至于第几个是结束符就看运气了
所以如果用于字符串的话 char a[5]={'a','b','c','d','e'}; 正确的应该是
char a[6]={'a','b','c','d','e','\0'};
温馨提示:答案为网友推荐,仅供参考
第1个回答 推荐于2016-08-22
一般不能,除非特殊用途,比如故意弄个溢出
C语言规定必须以“\0”结尾,所以正常使用的话必须预留至少1个字节的空间存储这个0,否则在输出字符串的时候,会把字符串后面的东西一起输出,知道遇到0
C语言规定必须以“\0”结尾,所以正常使用的话必须预留至少1个字节的空间存储这个0,否则在输出字符串的时候,会把字符串后面的东西一起输出,知道遇到0
第2个回答 2014-08-15
简单粗暴点,你把字符数组跟字符串混淆了,这是两个概念。字符数组char a[5]={a,b,c,d,e};
这么初始化肯定没有问题的,字符数组是个变量。字符串是个常量,必须要以\0结尾,如果不以\0结尾,许多字符串函数用了就会报错,比如strlen等等。。
这么初始化肯定没有问题的,字符数组是个变量。字符串是个常量,必须要以\0结尾,如果不以\0结尾,许多字符串函数用了就会报错,比如strlen等等。。
第3个回答 推荐于2017-11-26
这个是要看情况的,在某些情况下,字符数组末尾反而不允许有\0。
比如说,我要从文件中读取一行数据,并分成若干个项目后写入结构体。设文件每一行的内容如下。(项目中间无分隔符,括号里面是长度)
姓名(8)身份请号码(20)出生地(200)
读取时,可以直接写下面这一行代码
memcpy( 结构体指针,字符串指针, 结构体大小)
很明显,这时如果在结构体内的各个字符串数组中添加\0,会导致最后的拷贝结果不正确,所以这时就不能使用结束符。实际长度必须与有效长度相等。追问
比如说,我要从文件中读取一行数据,并分成若干个项目后写入结构体。设文件每一行的内容如下。(项目中间无分隔符,括号里面是长度)
姓名(8)身份请号码(20)出生地(200)
读取时,可以直接写下面这一行代码
memcpy( 结构体指针,字符串指针, 结构体大小)
很明显,这时如果在结构体内的各个字符串数组中添加\0,会导致最后的拷贝结果不正确,所以这时就不能使用结束符。实际长度必须与有效长度相等。追问
那对于一般情况 比如把几个字符输入到字符数组再输出 定义时实际长度等于有效长度行不行
追答不行,由于没有结束字符,输出时系统无法准确定位字符串的结束,会继续输出后面的内存空间的信息。也就是所谓的“脏信息”。
总结一下吧,\0并不是必须的,你不加系统也不会认为你犯错了,一样会让你编译运行。
加不加\0的区别,加了\0,系统就知道你的字符串是在什么位置结束的,统计长度,输出什么的都会以你的\0为准。
不加的话,你需要自己控制每一次操作字符串时不能超过字符串的有效长度。否则就会出大问题。
第4个回答 2018-03-03
可以,就你说的例子char a[5]应该有char a[0]char a[1]char a[2]char a[3]char a[4]char a[5],所以是留了位置的。