黑马程序员技术交流社区

标题: 字符串 [打印本页]

作者: AndyWang    时间: 2014-7-19 23:20
标题: 字符串
今天看到字符串 视频中MJ老师说字符串以数组存储时在末尾会有一个隐藏字符 '\0' 有点不懂 要是字符数组长度等于字符串中字符的个数 那这个'\0' 存在哪呢?
作者: fantacyleo    时间: 2014-7-19 23:39
首先要明确,'\0'也是一个字符,就存在字符数组中,因此字符数组的长度包括这个'\0'。但字符串长度则不计这个'\0'。这就是个定义问题。记住就好
作者: 443201683@qq.co    时间: 2014-7-19 23:43
这样的话会溢出,报错。找个编译器试一下就知道了。
作者: AndyWang    时间: 2014-7-19 23:47
fantacyleo 发表于 2014-7-19 23:39
首先要明确,'\0'也是一个字符,就存在字符数组中,因此字符数组的长度包括这个'\0'。但字符串长度则不计这 ...

嗯 谢谢 能具体说明下吗 比如 char name[2] = "it" ; 在这个字符串中  '\0' 是怎样存储的呢?
作者: Melody_cw    时间: 2014-7-20 00:02
AndyWang 发表于 2014-7-19 23:47
嗯 谢谢 能具体说明下吗 比如 char name[2] = "it" ; 在这个字符串中  '\0' 是怎样存储的呢? ...

首先这个定义的字符数组就不会成立,你编译下
#include
int main()
{
        char name[2]="it"
        printf("%s",name);
}
它会给你报一个溢出的错误
作者: fantacyleo    时间: 2014-7-20 00:23
AndyWang 发表于 2014-7-19 23:47
嗯 谢谢 能具体说明下吗 比如 char name[2] = "it" ; 在这个字符串中  '\0' 是怎样存储的呢? ...

额,抱歉,我理解错你的意思了。。。如果是数组长度不足以容纳'\0',那'\0'就不会被存入数组。这样做风险很大。如果你严格按定义的数组长度2来使用数组,那还不会有什么问题,程序正常运行。但如果你之后忘了'\0'没有存入,想用'\0'判断字符串终结,或调用了依赖'\0'判断终结的函数,比如printf("%s"),那轻则打印出多余的字符,重则非法访问其他内存,程序崩溃。
作者: AndyWang    时间: 2014-7-20 00:51
fantacyleo 发表于 2014-7-20 00:23
额,抱歉,我理解错你的意思了。。。如果是数组长度不足以容纳'\0',那'\0'就不会被存入数组。这样做风险 ...

比如说
char name1[2] = "it";
char name2[5] = "it";
printf("%s\n",name1);
如果这样运行 应该会输出:itit
应该是这样吧?
作者: fantacyleo    时间: 2014-7-20 00:54
AndyWang 发表于 2014-7-20 00:51
比如说
char name1[2] = "it";
char name2[5] = "it";

这个,我只能说有的编译器是这样的。没查过C标准,不确定这样做是不是在所有编译器上都有保证。不过,字符数组给'\0'留足空间,会让你少很多莫名其妙的烦恼。
作者: AndyWang    时间: 2014-7-20 00:56
fantacyleo 发表于 2014-7-20 00:54
这个,我只能说有的编译器是这样的。没查过C标准,不确定这样做是不是在所有编译器上都有保证。不过,字 ...

ok 谢谢 你解答的好细心的呢 你是不是已经拿到入学名额了?
作者: fantacyleo    时间: 2014-7-20 01:02
AndyWang 发表于 2014-7-20 00:56
ok 谢谢 你解答的好细心的呢 你是不是已经拿到入学名额了?

不用客气。我还在观望,一是现在没法脱产学习4个月。二是还在犹豫学ios还是android。。。
作者: AndyWang    时间: 2014-7-20 01:08
fantacyleo 发表于 2014-7-20 01:02
不用客气。我还在观望,一是现在没法脱产学习4个月。二是还在犹豫学ios还是android。。。 ...

哦 那我觉得你现在技术已经很厉害了 到时候不管学哪一个应该都没问题吧  再次谢谢你细心地解答 早点休息吧 不早了  晚安




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2