c语言strcpy函数 内部分配,C语言strcpy函数实现.

看面试题的时候有个题目是不使用库函数,实现strcpy函数.(字符串拷贝函数)

这个是我写的代码,在机器上编译过了.

void my_strcpy(char *t,char *s){while((*t++=*s++));

}

看了很多帖子,发现我这个代码的问题还是很多的.即使这么简单的一个小程序也有很多的东西需要考虑.下面总结:

1.关于函数返回值.我写的是void,即函数不返回参数.所以我这个函数的唯一目的是将s地址字符串复制到t上.不返回任何信息.这样写的代码在以后使用是不方便的.林锐里提到:返回char

*的目的是为了实现链式表达式.如:

int length=strlen(strcpy(strDest,"HelloWorld"));//如果没有返回char *那么要多写几行代码非常麻烦.

2.保留原串的问题.

正因第一个错误犯下导致了第二个错误的直接产生,那就是保留目标串首地址的问题.既然要返回目标串的话肯定是返回目标串的首地址.即return

t.而在函数里对t要进行地址移动操作,所以在开始要保存t的地址.

char *strDest=t; //t的地址保留在strDest,这样直接返回strDest即可,而可以操作t.

3.关于源串,目标串的检查问题.

这个主要是检查源串,目标串指针的合法性.

assert((t!=NULL) && (s!=NULL)); //如果t,s均!=NULL那么就继续执行,如果不是的话并退出程序并输出错误信息.

这样一来,比较合格的strcpy()函数完成:(这个也是林锐博士在高质量C/C++编程当中的源代码)

char *my_strcpy(char *t,char *s){char *strDest=t;

assert((*t)!=NULL && (*s)!=NULL);while((*t++=*s++));returnstrDest;

}

其实在GNU C的strcpy源代码当中并没有对串指针合法性的检测.看了网上帖子大家争论的原因是:assert()这个函数非常的繁琐耗时.所以GNU

C是为了提高效率,而且本意是如果出错则程序会crash,而检查crash则是程序员慢慢调试.库函数则是以效率为先!

原文:http://www.cnblogs.com/brillliu/p/3548866.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值