关于strlen的一点思考

  今天在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也就解释了,字符串的长度,实际长度。

posted @ 2012-08-17 16:37  曾经的风  阅读(240)  评论(0)    收藏  举报