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

summber_flower 2013-10-19 07:18:53
char str[5]={'1','2','3','4','5'} 此时的数组str难道不需要 '\0' 来表示结束吗?
...全文
557 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2013-10-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
//
[/quote] 大神一出, 谁与争锋. 确实我没有考虑字符串操作的安全版本. 虽然说有安全版本, 但是\0结尾是一好的做法, 万一哪里未使用安全版本, 那就等着出问题了.
赵4老师 2013-10-21
  • 打赏
  • 举报
回复
引用 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
//
liuhongwei110 2013-10-21
  • 打赏
  • 举报
回复
引用 楼主 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来结束的话,这样再来判断第一种情况就会产生越界的情况,所以要谨慎。
千树之影 2013-10-21
  • 打赏
  • 举报
回复
引用 11 楼 u010131960 的回复:
release模式跑跑看。
jiandingzhe 2013-10-21
  • 打赏
  • 举报
回复
看你用来干什么。
wb_rock 2013-10-21
  • 打赏
  • 举报
回复
能不能在数组赋值完成之后最后一个元素赋值为'\0'?
xiaohuh421 2013-10-21
  • 打赏
  • 举报
回复
如果你不把它字符数组当0结尾的字符串处理,就没有问题. 但, 如果你要对其进行字符串输出, 或者使用字符串处理函数, 那\0就必须加, 否则行为未定义.
anthow 2013-10-20
  • 打赏
  • 举报
回复
凌典 2013-10-20
  • 打赏
  • 举报
回复

char a[5]={'1','2','3','4','5'};
char b[]="1,2,3,4,5"
strcmp(a,b)=-1;
类似的问题,可以看看http://bbs.csdn.net/topics/390618929
summber_flower 2013-10-20
  • 打赏
  • 举报
回复
引用 12 楼 lm_whales 的回复:
1) "123456“ 是字符串,有结束符号,如果有结束符的数组较短,.或者刚好多一个字节,勉强可用. 否则,会出问题. 这里的问题是: 你的程序,要保证,相同条件下,都是可用的. 你要保证,代码是: 编译能通过的,运行不出错的,逻辑正确的,没有那些小小差错的. 而不是,保留这种,有时正确,有时错误,有时崩溃,有时越界访问,这种有一大堆问题的代码. 如果两个数组,都是字符数组,没有结束符,那就会,一直比较,直到找到不同字符,或者找到至少一个结束符为止. 但是,这种似乎没问题的代码,明显不能保证,程序是正确的,运行也不出错,逻辑也没问题. PS : 字符串操作,要保证操作的对象,是个字符串,而不是,没有结束符的,字符数组. 不然,一定会在某些时候,出一些这样那样的,令人头痛的问题. [/quote] 谢了
lm_whales 2013-10-20
  • 打赏
  • 举报
回复
引用 7 楼 u011718046 的回复:
[quote=引用 6 楼 worldy 的回复:] 一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃
查了一下 strcmp是依赖 '\0' 的 但是实际是可以用的 我在一个 char[6]的数组里放了'123456' 然后strcmp(数组,"123456“==0) 是成立的[/quote] 1) "123456“ 是字符串,有结束符号,如果有结束符的数组较短,.或者刚好多一个字节,勉强可用. 否则,会出问题. 这里的问题是: 你的程序,要保证,相同条件下,都是可用的. 你要保证,代码是: 编译能通过的,运行不出错的,逻辑正确的,没有那些小小差错的. 而不是,保留这种,有时正确,有时错误,有时崩溃,有时越界访问,这种有一大堆问题的代码. 如果两个数组,都是字符数组,没有结束符,那就会,一直比较,直到找到不同字符,或者找到至少一个结束符为止. 但是,这种似乎没问题的代码,明显不能保证,程序是正确的,运行也不出错,逻辑也没问题. PS : 字符串操作,要保证操作的对象,是个字符串,而不是,没有结束符的,字符数组. 不然,一定会在某些时候,出一些这样那样的,令人头痛的问题.
summber_flower 2013-10-19
  • 打赏
  • 举报
回复
引用 8 楼 max_min_ 的回复:
[quote=引用 7 楼 u011718046 的回复:] [quote=引用 6 楼 worldy 的回复:] 一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃
查了一下 strcmp是依赖 '\0' 的 但是实际是可以用的 我在一个 char[6]的数组里放了'123456' 然后strcmp(数组,"123456“==0) 是成立的[/quote] str[5] = '\0';给字符串一个结束符的![/quote] str[5] 如果全部填可见字符是可以的,貌似并不需要填 '\0'
lin5161678 2013-10-19
  • 打赏
  • 举报
回复
引用 7 楼 u011718046 的回复:
[quote=引用 6 楼 worldy 的回复:] 一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃
查了一下 strcmp是依赖 '\0' 的 但是实际是可以用的 我在一个 char[6]的数组里放了'123456' 然后strcmp(数组,"123456“==0) 是成立的[/quote]只是巧合 不能用 会出错
max_min_ 2013-10-19
  • 打赏
  • 举报
回复
引用 7 楼 u011718046 的回复:
[quote=引用 6 楼 worldy 的回复:] 一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃
查了一下 strcmp是依赖 '\0' 的 但是实际是可以用的 我在一个 char[6]的数组里放了'123456' 然后strcmp(数组,"123456“==0) 是成立的[/quote] str[5] = '\0';给字符串一个结束符的!
summber_flower 2013-10-19
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃
查了一下 strcmp是依赖 '\0' 的 但是实际是可以用的 我在一个 char[6]的数组里放了'123456' 然后strcmp(数组,"123456“==0) 是成立的
worldy 2013-10-19
  • 打赏
  • 举报
回复
引用 3 楼 u011718046 的回复:
[quote=引用 2 楼 worldy 的回复:] 当然不是,不管是数组还是指针,你这样明确每个元素,那么编译器是不会自动给加最后的0 这样定义就会加: char a[]="12345"
这样是用字符串常量初始化,会自动加 '\0' 我想知道对于一个字符数组来说,没有 '\0' 有没有关系,貌似没啥关系,照样可以 strcmp等 不是说strlen是遇到 '\0'就结束,那一个字符数组没有 '\0'可咋办啊,岂不是strlen不能用了? [/quote] 一些依赖0结束的函数都不能用,否则,轻则得到错误结果,重者访问越界,系统崩溃
lin5161678 2013-10-19
  • 打赏
  • 举报
回复
是的 没有以0结尾的字符数组 不能使用 strcpy strcat 这些函数
lin5161678 2013-10-19
  • 打赏
  • 举报
回复
不是字符串就不能用 strcmp等
summber_flower 2013-10-19
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
当然不是,不管是数组还是指针,你这样明确每个元素,那么编译器是不会自动给加最后的0 这样定义就会加: char a[]="12345"
这样是用字符串常量初始化,会自动加 '\0' 我想知道对于一个字符数组来说,没有 '\0' 有没有关系,貌似没啥关系,照样可以 strcmp等 不是说strlen是遇到 '\0'就结束,那一个字符数组没有 '\0'可咋办啊,岂不是strlen不能用了?
worldy 2013-10-19
  • 打赏
  • 举报
回复
当然不是,不管是数组还是指针,你这样明确每个元素,那么编译器是不会自动给加最后的0 这样定义就会加: char a[]="12345"
加载更多回复(1)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧