为什么定义了一个10个元素的数组,而用strlen得到的值却不是10?

rolen 2004-08-25 02:22:58
如:
(1)
char a[10];
int iLen = strlen(a);//iLen等于15。a[20]的时候等于23。a[100]的时候等于103

(2)
char a[10];
memset(a, 0x00, 10);
int iLen = strlen(a);//iLen等于10。a[20]的时候等于20。a[100]的时候等于100

(3)
char a[10];
a[0] = NULL;
int iLen = strlen(a);//iLen等于10。a[20]的时候等于20。a[100]的时候等于100

这是为什么?请帮忙解释下!
...全文
692 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpsinz 2004-08-26
  • 打赏
  • 举报
回复
小弟初学c++,大家的话对我很有启发
demo001 2004-08-26
  • 打赏
  • 举报
回复
C的数组是不做越界检查的
heaven_tsm 2004-08-26
  • 打赏
  • 举报
回复
up
learnlife 2004-08-26
  • 打赏
  • 举报
回复
楼主就仔细看看人家的回复好吧?初级问题!
whyglinux 2004-08-26
  • 打赏
  • 举报
回复
关键在于楼主定义的数组没有初始化,数组里面是一些不固定的值,这时求其字符串长度是没有意义的。
江南编程浪子 2004-08-26
  • 打赏
  • 举报
回复
renfengxing(任风行)
说的很明白了啊,楼主好好看看啊

还有提醒一下
如果函数是这样的:
void xxx(char *str,.....参数)
{
cout<<sizeof(str)<<endl;
}

这里输出的答案是4,因为这里是求一个指针占用内存的大小。
vzxq 2004-08-26
  • 打赏
  • 举报
回复
UP
ra3 2004-08-26
  • 打赏
  • 举报
回复
ai! 这都是 0 惹的祸, 不关月亮什么事啊!
一路奔跑 2004-08-26
  • 打赏
  • 举报
回复
还是不信这问题有鬼~

char a[10]; //15
cout<<strlen(a)<<endl;
char b[20]; // 35
cout<<strlen(b)<<endl;
char c[50]; //87
cout<<strlen(c)<<endl;
char d[100]; //87
cout<<strlen(c)<<endl;

我的环境VC6 + WIN2K;
所以答案应该是无定义的,楼主好象钻到一个死胡同里去了~

你仔细看看 回复人: vc2004() 的

char a[78] = {'a','a','s','o','o','\0','o','p','s'};
int a = strlen(a);

a 的值是5~~!!!!判断结束的标志应该很明显的啊~~

你的char a[10]; char b[20]; char c[50]; char d[100]; 这些内存都没初始化,说不定在哪会出现一个 ‘\0’;长度当然是未定义的啊!!!

你对一快未初始化的内存进行操作~~这本来就是个错误~~还拿出一些怪怪的数据来折磨自己~这不是自找苦吃吗!还自己找出一条规律出来了~

还不信你试试把他们弄成全局变量或是static,你看看是不是都是0!!!!!!!!!

还有,我用CB6得到的答案,是1,3,1,1。
rolen 2004-08-26
  • 打赏
  • 举报
回复
谢谢wwwooowww(熔点),renfengxing(任风行)和各位朋友的回答。
athena301 2004-08-26
  • 打赏
  • 举报
回复
strlen()
检查的是实际长度。
比如:
int a[10]={1,2,3};
printf("%d",strlen(a));

结果,不是10,而是3。

rolen 2004-08-25
  • 打赏
  • 举报
回复
很感谢大家的热烈回答!

我提问这个题目的时候确实忘记了到底是sizeof还是strlen。
下午回去又测试了一次,是strlen,而且错误依旧!我现在再写一遍,请大家帮忙看看,谢谢!
(1)
char a[10];
int iLen = strlen(a);//iLen等于15

(2)
char a[20];
int iLen = strlen(a);//iLen等于23

(3)
char a[50];
int iLen = strlen(a);//iLen等于55

(4)
char a[100];
int iLen = strlen(a);//iLen等于103

环境是VC6+XP。

根据我测试结果,iLen的值总是等于4的倍数+3。如果说有字节填充我还能够接受这个答案,可是那个3是为什么得到的??
而且,如果在我定义了这个数组之后修改了其中任意一个数据成员的内容(如memset,附值等操作),iLen的值就是定义数组时的那个值,为什么??实在是百思不得其解,请指点!
yxs001 2004-08-25
  • 打赏
  • 举报
回复
只有定义了字符串才可用strlen()测试长度,没有定义字符串,得到的是一个不确定的值
用sizeof()运算符测的长度是正确的呀,我运行了结果正确
studyingpersons 2004-08-25
  • 打赏
  • 举报
回复
你用的是什么编译器呀?
char a[10];
int iLen = sizeof(a); //iLen就是10
vc2004 2004-08-25
  • 打赏
  • 举报
回复
给个例子说明它们的用法:
char a[78] = {'a','a','s','o','o','\0','o','p','s'};
int a = strlen(a);
int c = sizeof(a);
这时a的值是5;因为这个字符串中在第6个字符是'\0'.
c的值是78.它是实际分配到的内存大小.
Josephhu83 2004-08-25
  • 打赏
  • 举报
回复
wwwooowww(熔点)的说法没错,对于char a[10],strlen是从a[0]指向的地址开始算,不检察数组越界,直到遇到"\0"结束。所以经常会遇到得出的长度大于申请的长度。
hcsun 2004-08-25
  • 打赏
  • 举报
回复
我同意wwwooowww(熔点)的说法,关键是你char a[10];内存储的字符有多少个。strlen就是算实际存储的字符的个数的!
一路奔跑 2004-08-25
  • 打赏
  • 举报
回复
(1)
char a[10];
int iLen = strlen(a);//iLen的长度应该是为定义的~
(2)
char a[10];
memset(a, 0x00, 10); //判断字符串结束是以\0为标准的。跟0x00有什么关系~??
int iLen = strlen(a);//iLen等于10。a[20]的时候等于20。a[100]的时候等于100

(3)
char a[10];
a[0] = NULL; //用这样的代码来测试?????
int iLen = strlen(a);//iLen等于10。a[20]的时候等于20。a[100]的时候等于100

//本人有点不相信上面是你真正运行得到的答案。
//这个问题比较臭~~
GRACEPANDA 2004-08-25
  • 打赏
  • 举报
回复
同意wwwooowww(熔点)的说法。
involute 2004-08-25
  • 打赏
  • 举报
回复
嗯,搂主的strlen是用来检查字符串长度的,可是你刚刚定义了字符串的存储空间a[10],却还没有把任何字符串存储到这里,如何检查长度?

同意wwwooowww(熔点)的说法。
加载更多回复(5)

65,210

社区成员

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

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