您的位置:首页 > 其它

关于strlen的一点思考

2012-08-17 16:37 197 查看
  今天在c和指针的时候,要写一个copy_n()的函数,用自己的方法写出来,突然发现关于strlen的怪异的事情,代码如下:

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
void copy_n( char dst[], char src[], int n )
{
int i;
printf("len1 = %d, len2 = %d\n",strlen(src),strlen(dst));
for( i = 0; i < n; i++ )
{
if( i < strlen(src) )
dst[i] = src[i];
else
dst[i] = '\0';
}
}

int main()
{
char src[5]={
'a','b','c','d','\0'
},
dst[9];
int i;
printf("%d,%d\n",strlen(src),strlen(dst));
printf("%d,%d\n",sizeof(src),sizeof(dst));
int n = 7;
copy_n(dst,src,n);
for( i = 0; i < n; i++ )
{
printf("%c",dst[i]);
}
system("pause");
return 0;
}


突然发现strlen(src)是4,而strlen(dst)是20,strlen返回的是什么呢?继续发现下,后面再printf("%d,%d\n",sizeof(src),sizeof(dst));输出的是字符串的长度5和9,然而,strlen返回的是什么呢?4和20,如果是字符串的实际字符数,那么src是对的,那dst为什么是20呢?更发现一个神奇的问题,在c-free下面的结果是(4,20),而拿到vs2008,结果变成了(4,24),怎么回事呢?在百度百科上面找到这样一句话:“strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止”,结果不同的原因应该就是这样解释吧。那么这样结合起来,src的结果是4也就解释了,字符串的长度,实际长度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: