C++中的strdup函数为什么不对?

来源:百度知道 编辑:UC知道 时间:2024/06/05 04:18:16
我是这样写的
char *strdup_(char *a)//将字符串拷贝到新的位置
{
if(a!=NULL)
{
char *start=a;
int len=0;
while(*a++!='\0')
len++;
char *p=(char *)malloc(len+1);
while(*p++=*start++!='\0')
{}
return p;
}
return NULL;
}

我用这两个例子测试都不能输出正确结果,为什么?
char *b="ABDEFGGwHIJK";
char c[5]={'h','u','c','a','\0'};

循环中 *p++ 指针一直往后移。当循环结束,指针已经指向最后一个元素即‘\0’. return p 返回回去的是这个最后位置的地址(即‘\0’的地址)。你打印出来会什么也得不到。

char *strdup_(char *a)//将字符串拷贝到新的位置
{
if(a!=NULL)
{
char *start=a;
int len=0;
while(*a++!='\0')
len++;
char *p=(char *)malloc(len+1);
while((*p++=*start++)!='\0') // 修改处
{}
return p-(len+1); // 修改处
}
return NULL;
}

#include <iostream>
using namespace std;
char *strdup_(char *a)//将字符串拷贝到新的位置
{
if(a!=NULL)
{
char *start=a;
int len=0;
while(*a++!='\0')
len++;
char *p=(char *)malloc(len+1);
while((*p++=*start++)!='\0')//此处要加括号,因为!=的优先级要高,原来相当于*p++=(*start++!='\0') true或false
{}
return p-len-1;//p指向'\0'的后一位,因此要p-len-1
}
return NULL;
}
int main(){

char *a="asdw";
cout<<st