您的位置:首页 > 其它

实现strcpy函数功能

2014-05-27 11:25 239 查看
第一次写这个程序的时候写的很烂,感觉从网上找的这个很好。
char *strcpynry(char *strDest, char *strSource)
{
char* strDestCopy = strDest;//这里要先保存一下目的指针,因为下面会改变

if (strDest == NULL || strSource == NULL)//验证传进来的指针的合法性
throw "invalid argument(s)";//抛出异常
//使用异常的方法比传回不同的返回值效果好,
//因为能确认出错,而不是依赖于函数使用者检查返回值的自觉性

//挨个复制,且要保证最后的结束符也正常复制
while((*strDest++ = *strSource++) != '\0');

return strDestCopy;//注意要传回原始的目的指针
}


但是第二次自己又写的时候,突然发现了几个问题:

1.源字符串指针最好用const限定一下,这个是肯定正确的,而且查看了<string.h>中strcpy函数的原型:char *_cdecl strcpy ( char *_Dest, const char *_Source );

2.检查传入参数合法性用throw有好处,这个我同意;

3.感觉保存原始的目的指针不是特别必要,因为指针本身实际上还是通过值传递的方式传入的,所以调用函数那边的目的指针没有改变。不过函数中保存原始目的指针而且返回这个目的指针,我猜可能是为了这个函数能够嵌套调用,这样更灵活;

4.对于源字符串长度大于目的字符串的情况,这个函数和<string.h>中strcpy函数都会照样复制,不管目的字符串的容量,即:
char A[] = "abcd";
char B[] = "wrj";
strcpynry(B,A);


strcpy(B,A);

结束之后B都是"abcd"。

自己做了一个实验:
char A[] = "abcd";
char B[4] = "wrj";
B[3] = 'a';
B[4] = 'e';
B[5] = '\0';

编译通过,运行也没问题。不知道是不是因为这样,所以strcpy函数才放心大胆的统统复制了。

不过我就觉得复制过去的毕竟是未知的内存,能保证安全么?

5.while((*strDest++ = *strSource++) != '\0');语句非常简洁,赞。
自己第二次写的类strcpy函数:

void strcpynry (char * Dest, const char * Scr)
{
if (Dest == NULL || Scr == NULL)
return;

while (*Dest !='\0' && *Scr != '\0')
{
*Dest = *Scr;
Dest++;
Scr++;
}
}

比较一下,以知不足。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  strcpy