C — как сделать замену подстроки в строке (руками)?

В языке программирования C замена подстроки в строке может быть реализована с использованием указателей и стандартных функций строки, таких как strcpy и strcat.

Вот пример функции, которая заменяет все вхождения одной подстроки на другую в исходной строке:

#include <stdio.h>
#include <string.h>

void replaceSubstring(char *str, const char *old, const char *new) {
    char result[100]; // Результирующая строка, куда будем записывать изменения
    int i, cnt = 0;
    int newLen = strlen(new);
    int oldLen = strlen(old);

    // Пока в исходной строке есть вхождения подстроки old
    while ((i = strstr(str, old) - str) != -1) {
        // Копируем все символы до вхождения подстроки в результирующую строку
        strncpy(result + cnt, str, i);
        cnt += i;
        str += i + oldLen;

        // Копируем новую подстроку в результирующую строку
        strncpy(result + cnt, new, newLen);
        cnt += newLen;
    }

    // Копируем остаток исходной строки в результирующую строку
    strcpy(result + cnt, str);

    // Копируем результирующую строку обратно в исходную
    strcpy(str, result);
}

int main() {
    char str[100] = "Hello, world! Hello, John! Hello, world!";
    char old[10] = "Hello";
    char new[10] = "Hi";
    
    replaceSubstring(str, old, new);
    printf("%sn", str); // Выведет: "Hi, world! Hi, John! Hi, world!"

    return 0;
}

В данном примере, сначала объявляется функция replaceSubstring, которая принимает указатель на исходную строку (str), указатель на подстроку, которую нужно заменить (old), и указатель на новую подстроку, которой нужно заменить старую (new).

Функция использует цикл, который выполняется до тех пор, пока в исходной строке есть вхождения подстроки old. На каждой итерации цикла мы находим индекс первого вхождения подстроки old в исходной строке (с помощью функции strstr) и копируем все символы до этого вхождения в результирующую строку (result). Затем мы переходим к концу найденной подстроки и копируем новую подстроку new в результирующую строку. После завершения цикла мы копируем остаток исходной строки в результирующую строку. Наконец, результат перезаписывается в исходную строку.

При тестировании примера кода в main мы видим, что все вхождения строки "Hello" заменяются на "Hi".