Пошук та заміна тексту

C:
Пошук та заміна тексту

Як це зробити:

C не включає вбудованих функцій для безпосереднього пошуку та заміни в строках. Однак, це можна реалізувати, поєднавши різноманітні функції обробки строк, доступні у бібліотеці <string.h>, разом з деякою користувацькою логікою. Нижче наведено базовий приклад того, як знайти підстроку всередині строки та замінити її. Для спрощення цей приклад припускає достатній розмір буфера і не обробляє питання розподілу пам’яті, які ви повинні враховувати в продакшн-коді.

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

void replaceSubstring(char *source, char *sub, char *new_sub) {
    char buffer[1024];
    char *insert_point = &buffer[0];
    const char *tmp = source;
    size_t len_sub = strlen(sub), len_new_sub = strlen(new_sub);
    size_t len_up_to_match;

    while ((tmp = strstr(tmp, sub))) {
        // Розрахунок довжини до збігу
        len_up_to_match = tmp - source;
        
        // Копіювання частини перед збігом
        memcpy(insert_point, source, len_up_to_match);
        insert_point += len_up_to_match;
        
        // Копіювання нової підстроки
        memcpy(insert_point, new_sub, len_new_sub);
        insert_point += len_new_sub;
        
        // Переміщення за збіг у вихідній строці
        tmp += len_sub;
        source = tmp;
    }
    
    // Копіювання будь-якої залишкової частини вихідної строки
    strcpy(insert_point, source);
    
    // Вивід зміненої строки
    printf("Змінений рядок: %s\n", buffer);
}

int main() {
    char sourceStr[] = "Hello, this is a test. This test is simple.";
    char sub[] = "test";
    char newSub[] = "sample";
    
    replaceSubstring(sourceStr, sub, newSub);
    
    return 0;
}

Приклад виводу:

Змінений рядок: Hello, this is a sample. This sample is simple.

Цей код демонструє простий підхід до пошуку всіх випадків підстроки (sub) у вихідній строці та їх заміну на іншу підстроку (newSub), використовуючи функцію strstr для знаходження початкової точки кожного збігу. Це дуже базовий приклад, який не обробляє складні сценарії, такі як перекривання підстрок.

Поглиблений аналіз

Підхід, використаний у розділі “Як це зробити”, є фундаментальним, ілюструючи спосіб досягнення пошуку тексту та його заміни в C без сторонніх бібліотек. Історично, через наголос C на низькорівневе управління пам’яттю та продуктивність, його стандартна бібліотека не включає високорівневі функціональності маніпуляцій з рядками, які можна знайти в таких мовах, як Python або JavaScript. Програмісти мають вручну управляти пам’яттю та поєднувати різні операції з рядками для досягнення бажаних результатів, що збільшує складність, але пропонує більше контролю і ефективності.

Важливо відзначити, що цей ручний підхід може бути схильним до помилок, особливо при управлінні розподілами пам’яті та розмірами буферів. Неправильне оброблення може призвести до переповнення буферів і пошкодження пам’яті, роблячи код вразливим до безпекових ризиків.

У багатьох практичних сценаріях, особливо тих, що вимагають складної обробки тексту, часто варто розглянути інтеграцію сторонніх бібліотек, таких як PCRE (Perl Compatible Regular Expressions) для пошуку та заміни на основі регулярних виразів, що може спростити код і зменшити потенціал помилок. Крім того, сучасні стандарти та компілятори C все частіше пропонують вбудовані функції та безпечніші альтернативи для маніпуляції рядками, маючи на меті уникнення загальних пасток, спостережуваних у старих кодових базах C. Однак фундаментальне розуміння ручної обробки тексту залишається цінним навиком у наборі інструментів програміста, особливо для оптимізації додатків, критичних до продуктивності.