首页 > 试题广场 >

写出完整版的strcpy函数

[问答题]
如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:  
2分
void strcpy( char *strDest, char *strSrc ) 
{ 
  while( (*strDest++ = * strSrc++) != ‘\0’ ); 
} 
4分  
void strcpy( char *strDest, const char *strSrc )  
//将源字符串加const,表明其为输入参数,加2分 
{ 
  while( (*strDest++ = * strSrc++) != ‘\0’ ); 
} 
7分  
void strcpy(char *strDest, const char *strSrc)  
{ 
 //对源地址和目的地址加非0断言,加3分 
 assert( (strDest != NULL) && (strSrc != NULL) ); 
 while( (*strDest++ = * strSrc++) != ‘\0’ ); 
} 
10分  
//为了实现链式操作,将目的地址返回,加3分!  
char * strcpy( char *strDest, const char *strSrc )  
{ 
 assert( (strDest != NULL) && (strSrc != NULL) ); 
 char *address = strDest;  
 while( (*strDest++ = * strSrc++) != ‘\0’ );  
 return address; 
} 
编辑于 2019-05-29 15:16:29 回复(23)
http://blog.csdn.net/gpengtao/article/details/7464061/ 
考虑内存重叠的情况

  1. char str[10]= "abc" ;
  2. my_strcpy(str+1,str); 这段代码测试普通不考虑内存重叠的写***崩溃,当str指向c时,str+1变为C没有了‘\0’,会越界
  1. char *my_strcpy(char *dst,const char *src)
  2. {
  3. assert(dst != NULL);
  4. assert(src != NULL);
  5. char *ret = dst;
  6. memmove(dst,src,strlen(src)+1);
  7. return ret;
  8. }
  9. memmove函数会处理内存重叠的情况 保证重叠的部分会先拷贝出来而memcpy不一定能保证

编辑于 2017-05-05 10:12:39 回复(0)
strDest不需要再加‘/0’,因为char * 类型会自动补上。就例如  char c[1]    不用初始化也是装了个\0
发表于 2016-09-05 18:00:09 回复(0)
char * strcpy(char *dst, const char *src)
{
    if(dst == nullptr || src == nullptr) return nullptr;

    char *cp = dst;
    while(*cp++ = *src++);

    return dst;
}

发表于 2016-09-09 16:00:52 回复(1)



char *strcpy(char *strDest, const char *strSrc){
assert((strDest!=NULL) && (strSrc!=NULL));//首先判断两个指针指向的地址不为空   char *address = strDest;//然后声明一个指针,将目的指针的地址赋值给它
//将原指针的值挨个赋值给目的指针,直到遇到'\0'
while((*strDset++ = *strSrc++) != '\0'){
NULL;  
} return address;//返回复制的指针 }

编辑于 2016-04-12 14:37:33 回复(7)
char *strcpy(char *strDest, const char *strSrc)
{
    assert((strDest!=NULL)&&(strSrc!=NULL));
    char *address=strDest;
    while((*strDest++=*strSrc++)!='\0');
    return address;
}
发表于 2018-03-08 17:26:08 回复(0)
char *strcpy(char *dst, const char *src)//这个函数未考虑到覆盖的问题
{
    assert(dst && src);//防止空指针访问
    char *ret = dst;//存储起始位置
    while ((*dst++ = *src++) != '\0');//赋值到\0结束
        return ret;//返回目的地址起始
}

编辑于 2020-10-09 00:20:04 回复(0)
断言里是不是应该再加一条strDest != strSrc呢?
发表于 2020-05-21 15:10:14 回复(0)

char *strcpy(char* strDest,char* strSrc)

{ASSERT(NULL != strDest&&NULL != strSrc);

char* strAddress = strDest;

while((*strDest++ = *strSrc++) != '\0');

return strAddress;

}


发表于 2019-10-15 12:35:50 回复(0)
char * strcpy(char *strDest, const char *strSrc){
    assert((strDest != NULL) && (strSrc != NULL));
    char *address = strDest;
    while((*strDest++ = *strSrc++) != '\0');
    return address;
}

编辑于 2018-04-12 17:23:47 回复(0)
疑问:不需要判断源字符串比目的字符串数组小吗?
发表于 2018-03-22 10:50:24 回复(1)
const char* strcpy1(char* dst, const char* src);
const char* strcpy1(char* dst, const char* src)    // 返回const char*
{
	assert((dst != nullptr) && (src != NULL));
	
	const char* tmp = src;                    // 必须是const char*
	while ((*dst++ = *src++) != '\0') {};
	return tmp;
}

和前面的区别是 const char* tmp = src;

发表于 2017-06-11 16:24:15 回复(2)
char *strcpy(char *strDest, const char * strSrc)
{
 //将源字符串加const,表明其为输入参数
 //对源地址和目的地址加非0断言
 assert((strDest!=NULL)&&(strSrc!=NULL));
 char *address=strDest;
 while((*strDest++ = *strSrc++)!='\0')   ;  
 return address;
}
发表于 2017-05-02 10:09:10 回复(0)
内存重叠就不用考虑吗?
发表于 2016-06-22 21:11:25 回复(0)
(*strDest++ = * strSrc++) != ‘\0’
图中表达式参考c++ primer P129
赋值运算的结果是它的左侧运算对象,并且是一个左值
发表于 2020-08-06 12:15:50 回复(0)
char*strcpy(char*s1,const char*s2) { int i=0; while(s2[i] != '\0') { s1[i] = s2[i]; i++; } s1[i] = '\0'; return s1; }
发表于 2017-07-20 17:49:17 回复(0)
返回一个局部指针address,不会出错吗
发表于 2016-02-06 19:17:35 回复(3)
char* my_strcpy(char* str1, const char* str2)
{
    assert((str1 != NULL) && (str2 != NULL));
    char* add=str1;
    while ((*str1++ = *str2++) != '\0');
        return add;
}

发表于 2022-10-12 14:58:45 回复(0)
直接看百度百科的答案即可:strcpy_百度百科 (baidu.com)
发表于 2022-03-24 22:28:22 回复(0)

char* strcpy(char* des, const char* src)

编辑于 2021-07-03 16:27:16 回复(0)