Это может быть не самая лучшая реализация, но здесь вы найдете функцию stringReplace, которая выполняет задачу.
О вашем коде.Во-первых, лучше, чтобы вызывающая сторона предоставляла свой буфер dest вместо наличия статического буфера в функции.Тогда вы не проверяете переполнение буфера.
Ваш
strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$
будет копировать из A в A, за исключением первой итерации.Это не хорошо, буфер не должен перекрываться.Вместо этого используйте memmove
.
Но сама идея не является чистой, поскольку вы обновляете тот же буфер, который используете в качестве источника для перехвата других вхождений.
В какой-то момент вы перезаписываете ввод (когда strи буфер указывает на то же самое) потеря информации, так как ваше заменяющее слово длиннее оригинала, подлежащего замене, поэтому вы не сохраняете «следующий оригинальный символ».(Если вы попытаетесь использовать «work» вместо «world2», это должно сработать) ...
Таким образом, ваш current_index должен индексировать исходную строку str (и вы никогда не будете выполнять str = buffer), и выдобавит к вашему внутреннему буферу нужную вам часть (до появления «world», если найден, затем добавьте «world2», обновите current_index по длине «world» и продолжите).
Я бы сделал(пытаясь сохранить исходную идею, более или менее)
#include <stdio.h>
#include <string.h>
char *replace_str(char *str, const char *orig, const char *rep)
{
size_t buf_index = 0;
static char buffer[10000];
if (!strstr(str, orig)) // Is 'orig' even in 'str'?
{
return str;
}
buffer[0] = 0;
for(;;)
{
char *p;
if (!(p = strstr(str, orig)))
{
strcpy(buffer + buf_index, str);
return buffer;
}
strncpy(buffer + buf_index, str, p - str);
strcpy(buffer + buf_index + (p - str), rep);
buf_index += (p-str) + strlen(rep);
str = p + strlen(orig);
}
return buffer;
}
int main(void)
{
puts(replace_str("hello world world world", "wor", "world2"));
return 0;
}