帮忙解释下C++中的strcpy函数原型

来源:百度知道 编辑:UC知道 时间:2024/06/01 11:06:05
据说一个实现的原型是
char* str_copy(char* dest,const char* src)
{
if(dest==NULL)
{return NULL;}
if(src==NULL || *src=='\0')
{return NULL;}
char* testTemp=dest; *****
while((*testTemp++=*src++)!='\0'); *****
return testTemp;
}
请高手帮忙解释下每行的含义,尤其是我标注*的这两行,谢谢

另外还有一个版本是
char *strcpy(char *dest, const char *src)
{
if(dest == NULL) return NULL;
char * tmp=dest;
do
{
*(tmp++)=*src;
}while(*(src++));
return dest;
}
这个版本的正确吗?

这2个都正确,但是第二个存在安全隐患,容易导致数组越界问题;
第一个程序标注的地方解释如下:
第一段:char* testTemp=dest;//建立一个char型指针,指向dest所指向的内存区域,这句的目的是让外部指针testTemp来操作dest指向的内存,testTemp到最后指向内存的那个地方,都不会影响dest的具体位置。
第二段:while((*testTemp++=*src++)!='\0'); //这个得拆开看
首先指针自增表示指针偏移,char型的testTemp每次加1,都会在他指向的字符串内粗上向后偏移2个字节的跨度。
在看*testTemp是解引用偏移后的地址,得到这个地址上的内容,并用src同样偏移跨度上的值给他赋值。
括号内的内容完成,得到一个字符,将这个字符跟‘0’做比较看是否相等;

解释完毕

这个版本不正确啊
char类型的最后都是以'\0'结尾的,所以要判断是不是到了结尾就必需判断有没有读到\0,你的版本上没有这点,程序肯定会出错哈

第二个版本最后应该return tmp;
char* str_copy(char* dest,const char* src)
{
if(dest==NULL)
{return NULL;}
if(src==NULL || *src=='\0')
{return NULL;}
char* testTemp=dest; *****这个位置是存储目标地址首地址,最后要返回这个首地址的。
while((*testTemp++=*src++)!='\0'); *****把*src给*testTemp,然后判断*testTemp是否已到\0,到的话结束,否则++
return testTemp;
}

这两个版本的思路都是正确的,不过第一个中,返回值可能有问题,应该返回dest ,第