Замена слова в строке - 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 выполняет замену одного слова на другое в строке. Список действий:
- Объявление и инициализация переменных:
s
объявлен как массив символов, который содержит исходную строку.w1
иw2
объявлены как указатели на строки, которые нужно заменить.m
объявлен как размер строкиs
.- Функции
slen()
иsncmp()
объявлены как статические функции, которые будут использоваться внутри функцииstr_replace()
.
- Вывод исходной строки.
- Выполнение замены с помощью функции
str_replace()
. Функция принимает следующие параметры:m
- размер строкиs
.s
- указатель на строку, в которой нужно выполнить замену.w1
иw2
- указатели на слова, которые нужно заменить.
- Внутри функции
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
.
- Вычисление длины исходной строки
- Возврат результата замены.
- Вывод результата замены.
- Вывод символа новой строки.
- Завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д