阅读背景:

char str[5]={'1','2','3','4','5'} 此时的数组str难道不需要 '\0' 来表示结束吗?

来源:互联网 
char str[5]={'1','2','3','4','5'} 此时的数组str难道不需要 '
char str[5]={'1','2','3','4','5'} 此时的数组str难道不需要 '\0' 来表示结束吗?

21 个解决方案

#1


不是字符串 就不必

#2


当然不是,不管是数组还是指针,你这样明确每个元素,那么编译器是不会自动给加最后的0
这样定义就会加:
char a[]="12345"

#3


引用 2 楼 worldy 的回复:
当然不是,不管是数组还是指针,你这样明确每个元素,那么编译器是不会自动给加最后的0
这样定义就会加:
char a[]="12345"

这样是用字符串常量初始化,会自动加 '\0'
我想知道对于一个字符数组来说,没有 '\0' 有没有关系,貌似没啥关系,照样可以 strcmp等
不是说strlen是遇到 '\0'就结束,那一个字符数组没有 '\0'可咋办啊,岂不是strlen不能用了?

#4


不是字符串就不能用 strcmp等

#5


是的 没有以0结尾的字符数组 不能使用 strcpy strcat 这些函数

#6


引用 3 楼 u011718046 的回复:
Quote: 引用 2 楼 worldy 的回复:

当然不是,不管是数组还是指针,你这样明确每个元素,那么编译器是不会自动给加最后的0
这样定义就会加:
char a[]="12345"

这样是用字符串常量初始化,会自动加 '\0'
我想知道对于一个字符数组来说,没有 '\0' 有没有关系,貌似没啥关系,照样可以 strcmp等
不是说strlen是遇到 '\0'就结束,那一个字符数组没有 '\0'可咋办啊,岂不是strlen不能用了?


一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃

#7


引用 6 楼 worldy 的回复:
一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃

查了一下 strcmp是依赖 '\0' 的
但是实际是可以用的
我在一个 char[6]的数组里放了'123456'
然后strcmp(数组,"123456“==0) 是成立的

#8


引用 7 楼 u011718046 的回复:
Quote: 引用 6 楼 worldy 的回复:

一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃

查了一下 strcmp是依赖 '\0' 的
但是实际是可以用的
我在一个 char[6]的数组里放了'123456'
然后strcmp(数组,"123456“==0) 是成立的


str[5] = '\0';给字符串一个结束符的!

#9


引用 7 楼 u011718046 的回复:
Quote: 引用 6 楼 worldy 的回复:

一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃

查了一下 strcmp是依赖 '\0' 的
但是实际是可以用的
我在一个 char[6]的数组里放了'123456'
然后strcmp(数组,"123456“==0) 是成立的
只是巧合 不能用 会出错

#10


引用 8 楼 max_min_ 的回复:
Quote: 引用 7 楼 u011718046 的回复:

Quote: 引用 6 楼 worldy 的回复:

一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃

查了一下 strcmp是依赖 '\0' 的
但是实际是可以用的
我在一个 char[6]的数组里放了'123456'
然后strcmp(数组,"123456“==0) 是成立的


str[5] = '\0';给字符串一个结束符的!

str[5] 如果全部填可见字符是可以的,貌似并不需要填 '\0'

#11


#12


引用 7 楼 u011718046 的回复:
Quote: 引用 6 楼 worldy 的回复:

一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃

查了一下 strcmp是依赖 '\0' 的
但是实际是可以用的
我在一个 char[6]的数组里放了'123456'
然后strcmp(数组,"123456“==0) 是成立的

1) "123456“ 是字符串,有结束符号,如果有结束符的数组较短,.或者刚好多一个字节,勉强可用.
否则,会出问题.

这里的问题是:
你的程序,要保证,相同条件下,都是可用的.

你要保证,代码是:
    编译能通过的,运行不出错的,逻辑正确的,没有那些小小差错的.

而不是,保留这种,有时正确,有时错误,有时崩溃,有时越界访问,这种有一大堆问题的代码.

如果两个数组,都是字符数组,没有结束符,那就会,一直比较,直到找到不同字符,或者找到至少一个结束符为止.

但是,这种似乎没问题的代码,明显不能保证, 程序是正确的,运行也不出错,逻辑也没问题.
PS :

字符串操作,要保证操作的对象,是个字符串,而不是,没有结束符的,字符数组.
不然,一定会在某些时候,出一些这样那样的,令人头痛的问题.



#13


引用 12 楼 lm_whales 的回复:

1) "123456“ 是字符串,有结束符号,如果有结束符的数组较短,.或者刚好多一个字节,勉强可用.
否则,会出问题.

这里的问题是:
你的程序,要保证,相同条件下,都是可用的.

你要保证,代码是:
    编译能通过的,运行不出错的,逻辑正确的,没有那些小小差错的.

而不是,保留这种,有时正确,有时错误,有时崩溃,有时越界访问,这种有一大堆问题的代码.

如果两个数组,都是字符数组,没有结束符,那就会,一直比较,直到找到不同字符,或者找到至少一个结束符为止.

但是,这种似乎没问题的代码,明显不能保证, 程序是正确的,运行也不出错,逻辑也没问题.
PS :

字符串操作,要保证操作的对象,是个字符串,而不是,没有结束符的,字符数组.
不然,一定会在某些时候,出一些这样那样的,令人头痛的问题.




谢了 

#14



char a[5]={'1','2','3','4','5'};
char b[]="1,2,3,4,5"
strcmp(a,b)=-1;

类似的问题,可以看看 https://bbs.csdn.net/topics/390618929

#15


如果你不把它字符数组当0结尾的字符串处理,就没有问题.

但, 如果你要对其进行字符串输出, 或者使用字符串处理函数, 那\0就必须加, 否则行为未定义.

#16


能不能在数组赋值完成之后最后一个元素赋值为'\0'?

#17


看你用来干什么。

#18


引用 11 楼 u010131960 的回复:


release模式跑跑看。

#19


引用 楼主 u011718046 的回复:
char str[5]={'1','2','3','4','5'} 此时的数组str难道不需要 '\0' 来表示结束吗?


楼主非常细心,个人认为:
程序运行时,判断字符数组结束有两种方式:
1.通过伪0来结束,即'\0';
2.通过字符数组本身的定义的长度来结束,如str[5],这里的长度5;这也是定义字符数组必须定义长度的意义所在之一。
如令char str[5]={'a','b','c','d','e'};
这样,当你判断strcmp(str,"abcde")时,是=0的;

如果令char str[5]={'a','b','\0','d','e'};
当你判断strcmp(str,"ab")时,也=0;

但是要注意,如果你是自己改编了一个比较字符是否相同的函数时,依赖的是以伪0来结束的话,这样再来判断第一种情况就会产生越界的情况,所以要谨慎。

#20


引用 15 楼 xiaohuh421 的回复:
如果你不把它字符数组当0结尾的字符串处理,就没有问题.

但, 如果你要对其进行字符串输出, 或者使用字符串处理函数, 那\0就必须加, 否则行为未定义.

我发现我这个人特别喜欢抬杠!
#include <stdio.h>
#include <string.h>
char str[5]={'1','2','3','4','5'};
int main() {
    printf("%d\n",strncmp(str,"12345",5));
    printf("%.5s\n",str);
    return 0;
}
//0
//12345
//

#21


引用 20 楼 zhao4zhong1 的回复:
Quote: 引用 15 楼 xiaohuh421 的回复:

如果你不把它字符数组当0结尾的字符串处理,就没有问题.

但, 如果你要对其进行字符串输出, 或者使用字符串处理函数, 那\0就必须加, 否则行为未定义.

我发现我这个人特别喜欢抬杠!
#include <stdio.h>
#include <string.h>
char str[5]={'1','2','3','4','5'};
int main() {
    printf("%d\n",strncmp(str,"12345",5));
    printf("%.5s\n",str);
    return 0;
}
//0
//12345
//


大神一出, 谁与争锋.

确实我没有考虑字符串操作的安全版本. 

虽然说有安全版本, 但是\0结尾是一好的做法, 万一哪里未使用安全版本, 那就等着出问题了.

' 来表示结束吗? char str[5]={'1','2','3','4','5'} 此时的数组str难道不需要



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: