在不使用标准库的情况下复制字符串

Copying a string without using standard library

本文关键字:情况下 复制 字符串 标准      更新时间:2023-10-16

我有一个小问题,无法理解这里出了什么问题。我这里有以下代码:

#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)] = '';
}

这不会复制字符串,但如果使用数组而不是dstStr的char指针,则一切都很好。

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

您需要在对mStr执行malloc后返回它的值。现在,malloc的返回值和指向字符串副本的指针在您退出函数时消失。它从malloc泄漏内存,因为它失去了对它的跟踪

将您的功能更改为char* copyFrom(const char * str)

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

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

在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)] = '';
    *dststr = mStr;
    return;
}

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

char * dstStr = NULL;
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);

dstStr为NULL,第一行设置它。当copyFrom分配字符串时,它不会将该字符串返回给调用者。所以你的printf得到一个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;
    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)] = '';
}

dstStr未分配,因此您不会在任何地方对数据进行签名。使用malloc分配一个合适的内存块,然后进行复制。

它使用数组的原因是字符串存储在堆栈上,内存自动为其覆盖

这也是C而不是C++,因为C++字符串处理是通过std::string完成的。

您可以通过引用传递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;
}