char * изменить при применении функции - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь реализовать функцию, которая преобразует char* формы [name] в name. Вот моя функция:

char* rmChar (char* tagName){
    char* newName = tagName;
    newName++; //remove first character
    unsigned long len = strlen(newName)-1;

    if (newName[len] == '\n'){
        newName[len] = 0;
        newName[len-1] = 0;
    }
    else{
        newName[len] = 0;
    }

    return newName;
}

Я не понимаю, что если я применяю свою функцию к переменной типа char*, она изменится. Например, если я запустил следующий код:

char test[] =  "[test]";
printf("%s", rmChar(test));
printf("%s", test);

, он распечатает: test[test

Я не понимаю, почему переменная была изменена на [test? есть ли способ изменить мою функцию rmChar так, чтобы переменная test не изменилась?

Спасибо!

1 Ответ

0 голосов
/ 05 мая 2020

Передавая char*, вы передаете место, где существует строка, а не саму строку. Следовательно, изменение строки приведет к изменению исходной строки.

Чтобы избежать этого, вы можете скопировать строку перед изменением.

пример исправления:

#include <stdlib.h> /* for using malloc() and free() */

char* rmChar (char* tagName){
    /* copy input string */
    static char* copiedStr = NULL;
    free(copiedStr);
    copiedStr = malloc(strlen(tagName)+1);
    strcpy(copiedStr, tagName);
    /* and edit it */
    char* newName = copiedStr;
    newName++; //remove first character
    unsigned long len = strlen(newName)-1;

    if (newName[len] == '\n'){
        newName[len] = 0;
        newName[len-1] = 0;
    }
    else{
        newName[len] = 0;
    }

    return newName;
}

Эта функция позволяет бросать вернул указатель, как printf("%s", rmChar(test));, с минимальной утечкой памяти, но небезопасен, когда он используется из нескольких потоков.

...