LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 930|回复: 8

一个初级问题,字符串的长度,为什么和书上的不一样呢?

[复制链接]
发表于 2006-9-11 12:52:40 | 显示全部楼层 |阅读模式
看C++Primer,有关字符串长度的问题,请看一下代码:

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;

  4. int main()
  5. {
  6.   int array_len1=0,array_len2=0;
  7.   const char array1[] = { 'C', 'X', 'X' };
  8.   const char array2[] = "CXX";
  9.   
  10.   for (int i=0;i<15;i++ )
  11.     {
  12.         cout<<"array1["<<i<<"]="<<array1[i]<<"\t\t"
  13.         <<"array2["<<i<<"]="<<array2[i]<< endl;
  14.     };
  15.   array_len1=strlen(array1);
  16.   array_len2=strlen(array2);
  17.   cout<<"Array1_len="<<array_len1<<"\t\t"
  18.       <<"Array2_len="<<array_len2<<endl;
  19. }
复制代码


出来的结果很奇怪:

  1. array1[0]=C                array2[0]=C
  2. array1[1]=X                array2[1]=X
  3. array1[2]=X                array2[2]=X
  4. array1[3]=a                array2[3]=
  5. array1[4]=d                array2[4]=C
  6. array1[5]=?                        array2[5]=X
  7. array1[6]="                array2[6]=X
  8. array1[7]=                               array2[7]=a
  9. array1[8]=?                        array2[8]=d
  10. array1[9]=?                        array2[9]=?
  11. array1[10]="                array2[10]="
  12. array1[11]=                             array2[11]=
  13. array1[12]=7                array2[12]=?
  14. array1[13]=?                        array2[13]=?
  15. array1[14]=                             array2[14]="
  16. Array1_len=7                Array2_len=3
复制代码


不知错在哪里,请各位帮忙分析分析,多谢。:help
发表于 2006-9-11 13:41:19 | 显示全部楼层
字符串是以\0结尾的
strlen也是计算到\0的长度
第一个没有\0
第二个用字符串会自动加上\0
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-11 14:07:05 | 显示全部楼层
兄台说的没错,理论上是这样,关键的问题是在这个程序里按照理论的说法array1长度应为3,而array2应为4。可是表现的结果却是array1长度为7,array2长度为3,不知在程序中出了什么问题?
回复 支持 反对

使用道具 举报

发表于 2006-9-11 16:28:11 | 显示全部楼层
strlen 是不算 \0 的
回复 支持 反对

使用道具 举报

发表于 2006-9-11 16:31:59 | 显示全部楼层
array1长度确实为3,但是strlen返回的长度,并不是这个长度,stlen返回的是给定的指针到后面第一个\0之间的长度,且不包括\0。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-11 17:25:02 | 显示全部楼层
Post by x11
array1长度确实为3,但是strlen返回的长度,并不是这个长度,stlen返回的是给定的指针到后面第一个\0之间的长度,且不包括\0。
哦,原来是这样的,但是如果咱们抛开strlen不谈的话,那么请问老兄如何能正确显示字符串数组的长度?或者说如何可以让程序按照理论值来显示,array1为3 array2为4?
呵呵,我这个人比较爱打破砂锅问到底,总想把东西搞明白了,还请老兄费心指导一下,多谢。
回复 支持 反对

使用道具 举报

发表于 2006-9-11 18:10:57 | 显示全部楼层
这个问题其实不要用 strlen 来比较, 用 sizeof 就可以得到比较理论的结果了

为什么不用 strlen 呢? 因为 strlen 是通过寻找 0 来作为字符串结尾的, 因此在对 array1 进行操作时, strlen 会一直找到 0 为止, 哪怕这个位置已经超出了 array1 的范围, 就是说, 溢出了, 所以按楼主的做法, array_len1 其实是不确定的
回复 支持 反对

使用道具 举报

发表于 2006-9-11 20:33:51 | 显示全部楼层
再啰嗦一句: sizeof 和 strlen 何所异呢? 其实, sizeof 是编译器在编译(细节部分可参看编译原理相关书籍)时生成了一个立即数,而 strlen 是在运行时算出来的,算法使然.

btw: 如此
  1. const char array1[] = { 'C', 'X', 'X' };
复制代码
一般作:
  1. const char array1[] = { 'C', 'X', 'X', 0 };
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-12 09:35:06 | 显示全部楼层
终于弄明白了,多谢几位的热心帮助。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表