C将char *复制到char []

时间:2013-08-18 21:21:06

标签: c arrays memcpy strcpy strncpy

您好我正在尝试将char *指针复制到char []数组。

到目前为止这是我的代码

char * string_add(char * base, char * toAdd)
{
    char * string=malloc(strlen(base)+streln(toAdd)+1);
    sprintf(string,"%s%s",base,toAdd);
    char returnString[strlen(string)+1]; 
    // here comes my problem:
    memcpy(returnString,string,strlen(string)+1);
    // want to add free(string) here
    return returnString;
}

我想使用这样的函数来保存代码。我不想照顾每一个分配的内存。我也试过

memcpy(&returnString,string,strlen(string)+1);

以及strcpy和strncpy的一些变体。但是以下问题仍然存在:

如果我调用该函数两次,如:

int main(int argc, char * argv[])
{
    char * str1=string_add(argv[1],"-test1"); 
    char * str2=string_add(argv[1],"-test2"); 
    printf("%s, %s", str1,str2);
}

输出如下:

abc-test2, abc-test2

我怎么能意识到这一点?

提前谢谢!

5 个答案:

答案 0 :(得分:2)

在C中,你必须看看malloced内存,你声明的char数组在堆栈上,并且在函数返回后将消失,只有malloc内存会挂起。是的,你必须照顾它并清理它。

答案 1 :(得分:0)

我假设对你的函数的第二次调用会覆盖第一次调用创建的缓冲区的内容。

根据我的理解,您正在尝试连接两个字符串。

查看this回答。

基本上,由于在编译时不知道字符串的长度,因此您需要分配动态内存,而在完成处理新{{1}之后不要忘记free它。 }。

答案 2 :(得分:0)

在功能

char * string_add(char * base, char * toAdd)
{
    char * string=malloc(strlen(base)+streln(toAdd)+1);
    sprintf(string,"%s%s",base,toAdd);
    char returnString[strlen(string)+1]; 
    // here comes my problem:
    memcpy(returnString,string,strlen(string)+1);
    // want to add free(string) here
    return returnString;
}

您定义returnString[]但它只存在于函数的范围内。所以你必须改变使用背后的逻辑和returnString[]

的声明

答案 3 :(得分:0)

基本上,非malloc编辑的存储在例程结束后不会保留。您可能可以使用全局变量,但这会使一个简单的任务变得复杂,即连接两个字符串。

char * string_add(char * base, char * toAdd)
{
    char *string_ptr = malloc(strlen(base)+streln(toAdd)+1);

    sprintf(string_ptr, "%s%s", base, toAdd);

    // string_ptr points to heap storage that is permanent
    return string_ptr;
}

// in main() ....

char *s1 = string_add("A", "B");
// s1 points to storage on the heap as: "AB\0"
//
free(s1);  // OR allow system to clean-up when main() exits

答案 4 :(得分:0)

因此该代码有点不对劲。首先,你做:

char * string=malloc(strlen(base)+streln(toAdd)+1);

这是错误的,假设每个字符都是1个字节,它取决于平台。最好的办法是:

char * string=malloc((strlen(base)+streln(toAdd)+1) * sizeof(char));

加上malloc在CPU时间方面是昂贵的,你不会释放它。在那段代码中做你正在做的事情甚至不需要malloc。就这样做:

char returnString[strlen(base) + strlen(toAdd) + 1];

第二,你应该以不同的方式处理字符串。你能做的是:

strcpy(returnString,base);
strcat(returnString,toAdd);

或。对于类似这样的事情,最好的事情是在主str1和str2中声明,在main中将它们malloc,将指针传递给指向函数的指针。有功能copy / cat我上面显示的数据。然后完成。现在你不需要处理返回类型和所有内部mallocing和垃圾。在使用它们之后,你只需处理main中的两个malloc和主要的2个free。这是伪代码:

int main(int argc, char *argv[])
{
    char * str1 = (char *) malloc((sizeof(argv[1]) + sizeof("-test1")) * sizeof(char));
    //do same for str2
    copyString(&str1,argv[1],"-test1");
    //do same for str2
    //print
    //free like this:
    free(str1);
    //do same for str2
    return 0;
}

现在这里是copyString函数:

void copyString(char ** returned, char * base, char * add)
{
    strcpy(returned,base);
    strcat(returned,add);
}