标题:字符串长度


在C/C++中,字符串是以零('\0')结尾的。比如,对于下面的字符串:

"hello word"
 
在最后一个字符'd'后面,还有一个我们肉眼看不见的'\0'字符,作为该字符串的结束符。所以,"Hello word"其在内存中的存储形式为:
最后有一个我们看不见的'\0'。明白了字符串的结尾方式,那么如何计算字符串的长度呢?比如:

例题1:
char str1[]="12345678";
char str2[]={'1','2','3','4','5','6','7','8'};
char str3[]={'1','2','3','\0','5','6','7','8'};
sizeof(str1)=?
sizeof(str2)=?
sizeof(str3)=?
strlen(str1)=?
strlen(str2)=?
strlen(str3)=?

分析:
str1是一个字符数组,由字符串"12345678"进行初始化。由于"12345678"含有一个结尾字符'\0',所以str1数组共有9个字符。 因此sizeof(str1)=9。str2也是一个字符数组,它的长度由'1','2','3','4','5','6','7','8'8个字符初始化,并没有指明零字符。 因此sizeof(str2)=8。str3同样由8个字符初始化,因此sizeof(str3)=8。
strlen函数只计算字符串中不含零的字符个数。因此:strlen(str1)=8。而由于str2中最后一个字符不包含零,所以,str2不是一个有效的字符串, 因此strlen(str2)不确定。而对于字符数组str3,在第4个字符为'\0',所以作为一个字符串,在此处结尾。所以strlen(str3)=3。

答案:
 
sizeof(str1)=9
sizeof(str2)=8
sizeof(str3)=8
strlen(str1)=8
strlen(str2)=无结束字符0,所以字符串溢出,不确定
strlen(str3)=3

例题2:实现strlen方法。

分析:既然字符串是以'\0'结尾的,那么实现strlen也就很简单了,直接从左往右遍历字符串,遇到'\0'就退出。
size_t strlen (const char * str)
{
    const char *eos = str;
    while( *eos++ ) 
         ;
    return( eos - str - 1 );
}


那么,有没有不是以零结尾的字符串表示方法呢?实际上是有的。比如:UNICODE_STRING,ANSI_STRING。这两种类型的字符串表示方法, 就不是以零结尾的了,而是以首地址和有效长度来定义字符串。

思考题
1:改写strlen函数,只用一句话,不用任何临时变量,计算字符串字符个数。
2:在Windows系统注册表中,有一类注册表键里存放的是多字符串。所谓多字符串的定义为:
str1str2str3...strn'\0'组成,其中str1,str2,...strn都是以'\0'结尾的字符串,最后再加一个'\0'结尾组成。 设计一个算法,遍历并打印一个多字符串buffer中的每一个字符串。


看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注