(面试题的四种答案)重写strcpy库函数..看不懂

来源:百度知道 编辑:UC知道 时间:2024/06/06 05:11:32
下面是四种写法,四种写法的质量依次增强,能解释下这四种写法吗???
第一种:
void strcpy( char *strDest, char *strSrc )
{
while( (*strDest++ = * strSrc++) != ‘\0’ );
}

第二种:
void strcpy( char *strDest, const char *strSrc )
{
while( (*strDest++ = * strSrc++) != ‘\0’ );
}

第三种:
void strcpy(char *strDest, const char *strSrc)
{
assert( (strDest != NULL) && (strSrc != NULL) );
while( (*strDest++ = * strSrc++) != ‘\0’ );
}

第四种:
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
return address;
}

这是C C++程序员面试的题目,作者对四种不同的答案进行了评价.......

应该是第一种到第四种越来越健壮
第一种仅仅可以实现字符串的拷贝
第二种考虑了被拷贝字符串是不可以被改变的这种情况
第三种在考虑被拷贝字符串不可以改变的基础上又考虑了 被拷贝字符串和
目标字符串必须要已经分配了存储空间(否则报错)
第四种第三种情况的基础上 加上了 一个返回值 这种我不太明白 我想可
能是 考虑 这个目标字符串可以做左值的情况

1 基本思想 指针后移 依次复制 直到源字符串结束

2 源指针加上const 保证源字符串内容不会发生改变 增加可靠性

3 加入空串的判断 如果没有assert 即使空串也要执行一次指针的自加 如果没有注意到 strcpy函数之外 指针的安全性就不是我们能把握的了

4 前3个基础上 保存了目的指针 因为复制过程中 两指针都后移

小弟说说第四种,源地址理应不变,所以加上const, 进入程序后先用assert判断两个指针的合法性,即是否为空, 多申请一个address是保持strDest的地址不变,还有将它返回是为了下一步操作着想, 这样你可以在调用strcpy后不需要拿出strDest来就可以连续进行操作,如:strcpy(s1, strcpy(s2, s3));

同意一楼和三楼的说法!