Замена слова в строке - 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.
- Вычисление длины исходной строки
- Возврат результата замены.
- Вывод результата замены.
- Вывод символа новой строки.
- Завершение работы программы.