Замена слова в строке - C (СИ) (71908)

Узнай цену своей работы

Формулировка задачи:

Собственно, задача - ввести(с клавиатуры) строку и два слова. Все вхождения первого слова в строку заменить на второе слово, а все вхождения второго на первое.

Решение задачи: «Замена слова в строке»

textual
Листинг программы
#include <stdio.h>
#define MAX_LEN  256
static size_t slen(const char* s);
static int sncmp(const char* s, const char* w, size_t n);
char* str_replace(size_t m, char* s, const char* w1, const char* w2);
 
int main(void){
    char s[MAX_LEN] = "Тополь, Ель (Ель) Тополь-Ель, Ель";
    puts(s);
    puts( str_replace(MAX_LEN - 1, s, "Ель", "Тополь") );
    return 0;
}
 
//замена w1 -> w2 или w2 -> w1
char* str_replace(size_t m, char* s, const char* w1, const char* w2){
    size_t i, j, n, l;
    char*  p, *e, *q, *d, *t = s;
    const char*  ws[2] = { w1, w2 };
    const size_t ns[2] = { slen(w1), slen(w2) };
 
    n = slen(s);
    if((n <= 1) || (n >= m) || !ns[0] || !ns[1])
        return t;
    
    e = s + n;
    while(*s){
        for(i = 0; i < 2; ++i){
            if(sncmp(s, ws[i], ns[i])){
                j = i ^ 1;
                if(ns[i] < ns[j]){//растяжение
                    l = ns[j] - ns[i];
                    if((n + l) >= m)
                        return t;
 
                    n += l;
                    e += l;
                    for(q = e; q > s; --q)
                        *q = *(q - l);
                }
 
                w1 = ws[j]; 
                p  = s;
                while(*w1)
                    *p++ = *w1++;
 
                if(ns[i] > ns[j]){//сжатие
                    n -= l;
                    l  = ns[i] - ns[j];
                    for(q = p, d = p + l; *q; *q++ = *d++);
                }
                s = p - 1;
                break;
            }
        }
        ++s;
    }
    return t;
}
 
//кол-во
static size_t slen(const char* s){
    const char* t = s;
    while(*s)
        ++s;
    return (size_t)(s - t);
}
 
//сравнение
static int sncmp(const char* s, const char* w, size_t n){
    size_t i = 0;
    while(*s && (i < n) && (*s == *w)){
        ++s;
        ++w;
        ++i;
    }
    return (i == n) && (! *w);
}

Объяснение кода листинга программы

Этот код на C выполняет замену одного слова на другое в строке. Список действий:

  1. Объявление и инициализация переменных:
    • s объявлен как массив символов, который содержит исходную строку.
    • w1 и w2 объявлены как указатели на строки, которые нужно заменить.
    • m объявлен как размер строки s.
    • Функции slen() и sncmp() объявлены как статические функции, которые будут использоваться внутри функции str_replace().
  2. Вывод исходной строки.
  3. Выполнение замены с помощью функции str_replace(). Функция принимает следующие параметры:
    • m - размер строки s.
    • s - указатель на строку, в которой нужно выполнить замену.
    • w1 и w2 - указатели на слова, которые нужно заменить.
  4. Внутри функции str_replace() происходит следующее:
    • Вычисление длины исходной строки s с помощью функции slen().
    • Проверка условий для выполнения замены:
    • Если длина строки s меньше или равна 1, или длина строки s больше m, или w1 пустая строка, или w2 пустая строка, то возвращается исходная строка s.
    • В противном случае, происходит замена:
    • Копирование строки w1 в позицию, где встречается первое вхождение w1 в строке s.
    • Если w1 и w2 имеют разную длину, то выполняется растяжение строки s:
    • Копирование строки w2 в позицию, где встречается последнее вхождение w1 в строке s.
    • Вставка оставшейся части строки w2 после последнего вхождения w1 в строке s.
    • Если w1 и w2 имеют одинаковую длину, то выполняется сжатие строки s:
    • Удаление w1 из строки s.
    • Вставка строки w2 на место w1.
  5. Возврат результата замены.
  6. Вывод результата замены.
  7. Вывод символа новой строки.
  8. Завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы