如何为未知字符串使用malloc

问题描述 投票:-1回答:4

我有一个以特定方式混合2个字符串并生成新字符串的函数,如何分配新字符串的内存?

我曾尝试添加此代码,但不确定如何将其用于我不知道的字符串中。

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

char *CreateString(char *string1, char *string2) {
    int size;
    int size1 = 0;
    int size2 = 0;

    for (int i = 0; *(string1 + i); i++) {
        size1++;
    }

    for (int i = 0; *(string2 + i); i++) {
        size2++;
    }

    size = (size1 * size2) + size1;

    char string[size];
    char *stringptr = string;

    for(int i = 0; i < size; i = i + size2 + 1) {
        *(stringptr + i) = *(string1++);

        for (int j = 0; j < size2; j++) {
            *(stringptr + i + j + 1) = *(string2 + j);
        }
    }
    puts(string);
}

int main() {
    char string1[] = "chocolate";
    char string2[] = "123";

    CreateString(string1, string2);
    return 0;
}
c string function pointers malloc
4个回答
0
投票

使用strlenstring.h例程:

size_t size=strlen(string);
size_t size2=strlen(string2);
size_t total_size=(size*size2)+size;
//now you make a malloc of a string result ugual to total_size+1 due to the fact the string end with "/0" character.
char* string_final;
 string_final=malloc(sizeof(char)*(total_size+1));
    if(string_final==NULL){
        perror("Error in malloc");
    }
    else{
     //...continue
   }

0
投票

当我运行您的代码时,我得到了字符串:

c123h123o123c123o123l123a123t123e123

似乎您想在string2的每个字符之后添加string2

因此,在您的情况下,您可以致电malloc

size = (size1 * size2) + size1;
char *string = malloc(size + 1); // +1 for null character
if(!string) {
   printf("cannot malloc for string\n");
   return NULL;
}

您的函数应最后返回string。当您不想使用string以避免内存泄漏时,请不要忘记释放此函数的返回值。

下面的代码:

    for(int i=0;*(string1+i);i++){
        size1++;
    }

    for(int i=0;*(string2+i);i++){
        size2++;
    }

可以用strlen功能代替:

size1 = strlen(string1);
size2 = strlen(string2);

0
投票

您可以使用以下方式为字符串分配内存

char *stringptr = malloc(size + 1);

注意,您可以使用<string.h>中的字符串函数来简化代码:>

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

char *CreateString(const char *string1, const char *string2) {
    size_t size1 = strlen(string1);
    size_t size2 = strlen(string2);
    size_t size = size1 * (size2 + 1);
    char *stringptr = malloc(size + 1);

    if (stringptr) {
        for (size_t i = 0; i < size; i = i + size2 + 1) {
            stringptr[i] = *string1++;
            strcpy(stringptr + i + 1, string2);
        }
    }
    return stringptr;
}

int main() {
    char string1[] = "chocolate";
    char string2[] = "123";
    char *string3 = CreateString(string1, string2);
    if (string3) {
        printf("%s\n", string3);
        free(string3);
    } else {
        printf("cannot allocate memory\n");
    }
    return 0;
}

-2
投票
char* CreateString(const char* string1,const char* string2)
{
    char* buf = NULL;
    if(string1 && string2)
    {
        size_t len1 = strlen(string1);
        size_t len2 = strlen(string2);

        char* buf= (char*)malloc(len1 +len2 +1);
        if(buf){
            strcpy(buf,string1);
            strcpy(buf+len1, string2);
        }
        return buf;
    }
    return NULL;

}
© www.soinside.com 2019 - 2024. All rights reserved.