Есть ли способ улучшить эту функцию, которая заменяет вхождения подстрок другой строкой в ​​выделенной строке malloc? - PullRequest
0 голосов
/ 11 сентября 2010

Я очень плохо знаком с C, и я решил создать функцию str_replace, которая заменяет строки внутри строк, которые были созданы с помощью malloc.Кажется, что это работает, но кто-нибудь может найти место для улучшений.

Любой совет будет оценен.Я хотел бы знать, если люди думают, что найти число вхождений для расчета нового размера строки было бы хорошей идеей, и имеет ли смысл использовать мои указатели.

Ответы [ 2 ]

2 голосов
/ 11 сентября 2010

В целом это довольно солидно, некоторые вещи, которые я бы предложил, были бы

1) не называйте первый аргумент "string" .. Я думаю, это немного рискованно (не определяет ли string.h символ "string"?)

2) Я бы не освободил старую строку в функции str_replace, она не была выделена этой функцией, поэтому она не должна освобождать ее IMO, что не очень важно для этого примера, но обычно это хорошая привычка. Это также означало бы отсутствие необходимости в переменной "string_track", так как первый аргумент является просто копией указателя на строку, вы можете его испортить и просто не заботиться о том, где он заканчивается, потому что он выбрасывается, когда функция выходы.

1 голос
/ 11 сентября 2010

Одно предложение: если вы намереваетесь вызвать функцию с синтаксисом string = str_replace(string, "no", "nope");, то я бы предложил изменить первый аргумент на char**. Таким образом, вы можете изменить указатель напрямую, вместо того, чтобы предполагать, что пользователь использует эту конкретную запись вызова. Поскольку вы освобождаете исходную строку, следующий блок кода опасен:

char* str1;
char* str2;
str1 = malloc(SIZE_1);
/* Write something into the buffer here.. */
str2 = str_replace(str1, "from", "to");
free(str1);  // Whoops! Double free!

Изменяя первый параметр на char**, пользователь может безопасно освободить тот же указатель, который он использовал с malloc независимо от того, как он вызвал функцию. В этом случае вы можете либо заставить вашу функцию возвращать void, либо просто вернуть копию указателя на исходную строку (*string).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...