在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中的每一个字符串。
本页共48段,1537个字符,2739 Byte(字节)