C语言 字符数组在定义时实际长度能不能等于有效长度 不给\0留空间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 字符数组在定义时实际长度能不能等于有效长度 不给\0留空间相关的知识,希望对你有一定的参考价值。

比如初始化 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';
参考技术A 一般不能,除非特殊用途,比如故意弄个溢出

C语言规定字符串必须以“\0”结尾,所以正常使用的话必须预留至少1个字节的空间存储这个0,否则在输出字符串的时候,会把字符串后面的东西一起输出,知道遇到0
参考技术B 简单粗暴点,你把字符数组跟字符串混淆了,这是两个概念。字符数组char a[5]=a,b,c,d,e;
这么初始化肯定没有问题的,字符数组是个变量。字符串是个常量,必须要以\0结尾,如果不以\0结尾,许多字符串函数用了就会报错,比如strlen等等。。
参考技术C 这个是要看情况的,在某些情况下,字符数组末尾反而不允许有\0。
比如说,我要从文件中读取一行数据,并分成若干个项目后写入结构体。设文件每一行的内容如下。(项目中间无分隔符,括号里面是长度)

姓名(8)身份请号码(20)出生地(200)

读取时,可以直接写下面这一行代码
memcpy( 结构体指针,字符串指针, 结构体大小)

很明显,这时如果在结构体内的各个字符串数组中添加\0,会导致最后的拷贝结果不正确,所以这时就不能使用结束符。实际长度必须与有效长度相等。追问

那对于一般情况 比如把几个字符输入到字符数组再输出 定义时实际长度等于有效长度行不行

追答

不行,由于没有结束字符,输出时系统无法准确定位字符串的结束,会继续输出后面的内存空间的信息。也就是所谓的“脏信息”。

总结一下吧,\0并不是必须的,你不加系统也不会认为你犯错了,一样会让你编译运行。
加不加\0的区别,加了\0,系统就知道你的字符串是在什么位置结束的,统计长度,输出什么的都会以你的\0为准。
不加的话,你需要自己控制每一次操作字符串时不能超过字符串的有效长度。否则就会出大问题。

本回答被提问者和网友采纳
参考技术D 可以,就你说的例子char a[5]应该有char a[0]char a[1]char a[2]char a[3]char a[4]char a[5],所以是留了位置的。

以上是关于C语言 字符数组在定义时实际长度能不能等于有效长度 不给\0留空间的主要内容,如果未能解决你的问题,请参考以下文章

C语言 数组中字符串的长度的怎么计算的·~就是输入一个字符串怎么能快速的知道他的长度··

关于c语言的问题,输出数组s中字符串,子串从s[begin]开始,长度为len。

数据结构--单向链表

C语言中,对于不知道长度的数组怎样输入。。。

C语言中,对于不知道长度的数组怎样输入。。。

字符串长度怎么算