Как скопировать строку, которая была динамически выделена, в другую строку, которая была выделена динамически? - PullRequest
0 голосов
/ 25 апреля 2019

У меня возникают проблемы при попытке реализовать пользовательскую функцию strcpy, которая должна обрабатывать случаи, когда строка src больше, чем строка назначения. Здесь я предоставил некоторый код, чтобы вы, ребята, могли видеть всю функцию. Моя проблема в том, что каждый раз, когда я увеличиваю * dest, он переходит в нулевой адрес, несмотря на то, что я выделил достаточно памяти, чтобы вместить в него весь src. Это вызывает ошибку сегментации в (двойной указатель) dest = * src. dest хранится как char **, потому что в действительности аргумент, который должен быть передан, является другой строкой, возможно, меньшего размера, чем src, и я хочу перезаписать * dest настолько безопасно, насколько смогу.

int customStrCpy(char** dest, char* src){
    int strlen1 = strlen(*dest), strlen2 = strlen(src);
    if(strlen1 < strlen2){
        //Creates a dynamically allocated array that is big enough to    store the contents of line2.
        *dest = calloc(strlen2, sizeof(char));
        char* backup_str = *dest;

        int copy_arrs;
        for(copy_arrs = 0; copy_arrs < strlen2; copy_arrs++){
            **dest = *src;
            *dest++; src++;
        }
        *dest = backup_str;
    }
    else strcpy(*dest, src);
}

В конце (char **) dest должен указывать на правильную строку.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019

Вам нужно добавить 1 к длине строки, чтобы учесть нулевой терминатор, и вы должны освободить старое содержимое dest, если вы выделяете новую строку. После того, как вы это сделаете, вы можете сделать то же самое strcpy(), что и вы, когда вам не нужно перераспределять.

Также нет необходимости в типе возврата int (если вы не хотите добавить проверку ошибок в malloc() и вернуть результат состояния). Эта функция изменяет аргумент, он должен быть void.

void customStrCpy(char** dest, char* src){
    int strlen1 = strlen(*dest), strlen2 = strlen(src);
    if(strlen1 < strlen2){
        free(*dest); // Free the old string
        //Creates a dynamically allocated array that is big enough to store the contents of line2.
        *dest = malloc(strlen2+1);
    }
    strcpy(*dest, src); // or memcpy(*dest, src, strlen2+1);
}
0 голосов
/ 25 апреля 2019

Обычно strcpy возвращает char * для "прямого" использования в других операциях.

char *mysStrCpy(char **dest, const char *src)
{
    size_t len = strlen(src);
    char *tmpptr;

    *dest = malloc(len + 1);
    // or *dest = realloc(*dest, len + 1);
    if(*dest)
    {
        tmpptr = *dest;
        while(*tmpptr++ = *src++);
    }
    return *dest;
}
0 голосов
/ 25 апреля 2019
 *dest++;

увеличивает dest, а не указатель dest, на который указывает.Вы хотите:

(*dest)++;

пс: есть лучшие способы достичь того, что вы хотите ....

...