实现strcpy函数功能

第一次写这个程序的时候写的很烂,感觉从网上找的这个很好。
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++;
}
}

比较一下,以知不足。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值