Одно предложение: если вы намереваетесь вызвать функцию с синтаксисом 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
).