C++ 不使用标准库复制字符串

C++ 不使用标准库复制字符串,c++,C++,我这里有个问题,我不明白这里出了什么问题。我这里有以下代码: #include <stdio.h> #include <stdlib.h> #include <string.h> void copyFrom(char * mStr, char * str); int main() { char * srcStr = "Robert bought a good ford car"; char * dstStr = NULL;

我这里有个问题,我不明白这里出了什么问题。我这里有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  

void copyFrom(char * mStr, char * str); 
int main() {  

    char * srcStr = "Robert bought a good ford car";  
    char * dstStr = NULL;  
    copyFrom(srcStr, dstStr);
    printf("The string copied here is %s", dstStr);
    return 0;
}
void copyFrom(char * str, char * mStr)
{
    if(!mStr) {
        mStr = (char *)malloc((strlen(str)) + 1);
        if(mStr == NULL)
            return;
    }

    while(*mStr++ = *str++) {
        ;
    }

    mStr[strlen(str)] = '\0';
}
这不会复制字符串,但如果对dstStr使用数组而不是字符指针,则一切正常


您能告诉我这里出了什么问题吗?

DSTSR没有分配,所以您不能将数据放在任何地方。 使用malloc分配适当的内存块,然后进行复制

它与数组一起工作的原因是字符串存储在堆栈上,并自动为其分配内存


这也是C不C++,因为C++的字符串HANLIGN是通过STD::String。

< p>在Malc之后,需要返回MSTR的值。现在,当您退出函数时,malloc的返回值和指向字符串副本的指针将消失。它从malloc泄漏内存,因为它无法跟踪它

将函数更改为
char*copyFrom(const char*str)

然后从该函数返回mStr。然后您可以编写
dstStr=copyFrom(srcStr)

现在,POSIX C已经有了这个功能。它被称为
strdup

char * dstStr = NULL;
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);
dstStr
为空,第一行设置它。当
copyFrom
分配字符串时,它不会将该字符串返回给调用者。所以您的
printf
会得到一个空值。

您可以这样做

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void copyFrom(char * mStr, char * str);

int main() {
    char * srcStr = "Robert bought a good ford car";
    char * dstStr = NULL;
    dstStr = (char *)malloc((strlen(srcStr)) + 1);
    copyFrom(srcStr, dstStr);
    printf("The string copied here is %s", dstStr);
    return 0;
}

void copyFrom(char * str, char * mStr)
{
    while(*mStr++ = *str++) {
        ;
    }

    mStr[strlen(str)] = '\0';
}
#包括
#包括
#包括
作废copyFrom(char*mStr,char*str);
int main(){
char*srcStr=“罗伯特买了一辆好的福特汽车”;
char*dstStr=NULL;
dstStr=(char*)malloc((strlen(srcStr))+1;
copyFrom(srcStr,dstStr);
printf(“此处复制的字符串为%s”,dstStr);
返回0;
}
void copyFrom(char*str,char*mStr)
{
而(*mStr++=*str++){
;
}
mStr[strlen(str)]='\0';
}

您可以通过引用传递dest,而不是返回:

void copyFrom(const char * src, char *& dest); 


int main() {  

    char * srcStr = "Robert bought a good ford car";  
    char * dstStr = 0;  
    copyFrom(srcStr, dstStr);
    printf("The string copied here is %s", dstStr);

    return 0;
}
void copyFrom(char * str, char *& mStr)
{
    if(!mStr) {
        mStr = (char *)malloc((strlen(str)) + 1);
        if(mStr == NULL)
            return;
    }
    char* it = mStr;
    while(*it++ = *str++)
    {
        ;
    }
    *it = 0;
}

在C语言中,偶数指针是按值传递的。当您传递一个指向函数的指针时,函数将收到一个副本,即一个新指针,它指向调用函数中的指针所在的位置

因此,在您的代码中,当您传递
dstStr
时,您传递的是一个空指针
mStr
是一个新的空指针。当您为
mStr
分配内存时,此内存分配给此新指针,而不是
dstStr
。因此,当函数返回时,调用函数中的
dstStr
仍然为NULL,并且没有任何内容指向在
copyFrom()中分配的内存。你有内存泄漏

您需要将
dststr()
作为两级指针传递,以便更改它在调用函数中指向的内容:

void copyFrom(char * str, char **dstStr)
{   
    char* mStr; 

    mStr = (char *)malloc((strlen(str)) + 1);
    if(mStr == NULL)
        return;


    while(*mStr++ = *str++) {
        ;
    }

    mStr[strlen(str)] = '\0';

    *dststr = mStr;

    return;
}

当然,您的函数声明和调用也需要相应地更改。您的调用需要将
&dstStr
作为参数传递,而不仅仅是
dstStr

他需要。。。查看
copyFrom
的前两行,但该内存在函数结束时丢失。如果它向函数传递了一个字符**,那么它就可以工作了。正确的答案是有效的prototype@Zan啊..我误解了来源/目的地。谢谢你删除了错误的答案。这修复了它。谢谢。您正在复制字符串。问题是
mStr
被重新分配为指向一个本地值。它本身通过值传递,这对调用者中的
dstStr
没有影响。如果您将其作为
char*&mStr
传递,它应该可以工作。您还可以将函数更改为“void copyFrom(char*mStr,char**str);”并用copyFrom(srcStr,&dstStr)调用它 @戴维施瓦兹,它是C++代码。因为您改变了指针<代码> dSTSTR ,另一种方法可以用来读取:NOPE,问题是他MaloC与OUTU重新排列了EMALLATE数据,见@ ZANLYNXanswer@JoelFalcou:ZanLynx只是众多解决方案中的一种。通过引用(或指针指向指针)传递的代码< > dSTSTR < /COD>也将解决这个问题。如果我们必须涉足引用,然后C++,那么OP BETeTR使用STD::String;