strcpy函数的实现
来源:互联网 发布:php企业网站源码 编辑:程序博客网 时间:2024/06/16 05:55
已知strcpy函数的原型是:
char *strcpy(char *dst, const char *src);
- 实现strcpy函数
- 解释为什么要返回char *
- 假如考虑dst和src内存重叠的情况,strcpy该怎么实现
char * strcpy(char *dst,const char *src) //[1]{ assert(dst != NULL && src != NULL); //[2] char *ret = dst; //[3] while ((*dst++=*src++)!='\0'); //[4] return ret;}
[1]const修饰
源字符串参数用const修饰,防止修改源字符串。
[2]空指针检查
(A)不检查指针的有效性,说明答题者不注重代码的健壮性。
(B)检查指针的有效性时使用assert(!dst && !src);
char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。
(C)检查指针的有效性时使用assert(dst != 0 && src != 0);
直接使用常量(如本例中的0)会减少程序的可维护性。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。
[3]返回目标地址
(A)忘记保存原始的strdst值。
[4]'\0'
(A)循环写成while (*dst++=*src++);明显是错误的。
(B)循环写成while (*src!='\0') *dst++=*src++;循环体结束后,dst字符串的末尾没有正确地加上'\0'。
2.为什么要返回char *?
返回dst的原始值使函数能够支持链式表达式。
链式表达式的形式如:
int l=strlen(strcpy(strA,strB));
又如:
char * strA=strcpy(new char[10],strB);
返回strSrc的原始值是错误的。
其一,源字符串肯定是已知的,返回它没有意义。
其二,不能支持形如第二例的表达式。
其三,把const char *作为char *返回,类型不符,编译报错。
3.假如考虑dst和src内存重叠的情况,strcpy该怎么实现
char str[10]="abc"; my_strcpy(str+1,str);
调用系统的strcpy函数程序正常运行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这样的。
strcpy的正确实现应为:
- char *my_strcpy(char *dst,const char *src)
- {
- assert(dst != NULL);
- assert(src != NULL);
- char *ret = dst;
- memcpy(dst,src,strlen(src)+1);
- return ret;
- }
void * my_memcpy(void *dst,const void *src,unsigned int count) { assert(dst != NULL && src != NULL); void * ret = dst; if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝 { while(count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } } else //源地址和目的地址重叠,高字节向低字节拷贝 { dst = (char *)dst + count - 1; src = (char *)src + count - 1; while(count--) { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return ret; }
http://www.cnblogs.com/chenyg32/p/3739564.html
http://blog.csdn.net/gpengtao/article/details/7464061/
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- strcpy函数的实现
- kmp学习笔记
- C++程序结合MySQL
- 服务器性能问题
- [Oracle学习]如何避免并发操作,使某列的数字每天都不会重复。
- MongoDb 对比sql 的基础
- strcpy函数的实现
- React 入门实例教程
- 关于Java 开学第一课
- 2017/9/27 Java笔记
- 图像频域变换(一)
- 【Pytorch】入门Pytorch,初次上手请多指教
- cookie保存用户名和密码
- 字符串匹配
- 【DBSDFZOJ 4430】陶陶摘苹果(DP)