0
点赞
收藏
分享

微信扫一扫

字符串 strcpy


strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。


该图为strcpy英文介绍:

 

字符串 strcpy_字符串

   当然也要区别下不同的编译器,可能处理执行有差异。


strcpy函数原型1
char * strcpy(char *a,char *b)
{ while((*(a++)=*(b++))!=0);return a;}

strcpy函数原型2
char *strcpy(char *strDest, const char *strSrc);//strDest为目标,strSrc为源
{
     assert((strDest!=NULL) && (strSrc !=NULL)); //如果两个为空则不用复制,直接中止
     char *address = strDest;       //用address指向strDest开始地址
     while( (*strDest++ = * strSrc++) != ‘\0’ ) //复制,直到源串结束;
        NULL ; //空操作
     return address ;    //返回strDest开始地址                       
     }
}//就这个算法看来是多余.

 

Char* 类型的返回值,可以实现链式表达式。

Exp:int length = strlen(strcpy(strdest,”Hello World”));

 

strlen函数的意思是测试字符串的字符长度,不含字符串结束标志的。
sizeof是个运算符,它的结果是字符串在内存中的所占字节大小,它要把\0算进去的。


strcpy只是复制字符串,但不限制复制的数量。很容易造成缓冲溢出,也就是说,不过dest有没有足够的空间来容纳src的字符串,它都会把src指向的字符串全部复制到从dest开始的内存,


int _tmain(int argc, _TCHAR* argv[])
{
    char *s = "Golden Global View";
    char c1[5];
    char c2[5];
    char c3[5];

    memset(c1,0,sizeof(c1));
    memset(c2, 0, sizeof(c1));
    memset(c3, 0, sizeof(c1));

    strcpy(c1, s);
    printf("%s", c1);
    printf("%c", c2[0]);
    printf("%c", c3[0]);

    getchar();
    return 0;
}


可见,strcpy 同 printf以结束符判断结果。 同时栈溢出,有的编译器的话,溢出导致修改邻居地址存储的数据,导致产生预料不到的问题。


  总结,使用strcpy,注重考虑结束符的问题!

举报

相关推荐

0 条评论