Удалить из строки S последнюю подстроку, совпадающую с S0 - C (СИ) (72058)
Формулировка задачи:
Даны строки S и S0. Удалить из строки S последнюю подстроку, совпадающую с S0. Если совпадающих подстрок нет, то вывести строку S без изменений.
Решение задачи: «Удалить из строки S последнюю подстроку, совпадающую с S0»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
char* str_remove_end(char* s, const char* w){
char* a, *b, *t = s;
size_t n = strlen(w);
a = b = strstr(s, w);
while(b != NULL){
a = b;
b += n;
b = strstr(b, w);
}
if(a != NULL)
strcpy(a, a + n);
return t;
}
int main(void){
char s[] = "APL ADA APL ADA END";
char w[] = "APL";
puts(s);
puts( str_remove_end(s, w) );
return 0;
}
Объяснение кода листинга программы
- В функции
str_remove_endмы объявляем два указателяaиbи инициализируем их значением первого вхождения подстрокиwв строкеs. - Мы также инициализируем переменную
tзначением исходной строкиs. - Затем мы находим последнее вхождение подстроки
wв строкеsиспользуя функциюstrstrи обновляем значения указателейaиb. - Если
bне равенNULL, это означает, что мы нашли еще одно вхождение подстрокиwв строкеs. Мы сдвигаем указательaвперед на длину подстрокиw, а затем обновляем значениеbчтобы он указывал на следующее вхождение подстрокиw. - Мы продолжаем этот процесс до тех пор, пока не найдем последнее вхождение подстроки
wв строкеs. - Если
aне равенNULL, это означает, что мы нашли последнее вхождение подстрокиwв строкеs. Мы копируем значениеaвa + n, чтобы удалить последнее вхождение подстрокиwиз строкиs. - Наконец, мы возвращаем исходную строку
sбез последнего вхождения подстрокиw. - В функции
mainмы объявляем строкуsи подстрокуw. - Мы выводим исходную строку
sс помощью функцииputs. - Мы вызываем функцию
str_remove_endс аргументамиsиwи сохраняем результат в переменнойresult. - Мы выводим результат с помощью функции
puts. - Мы возвращаем
0, чтобы указать, что программа успешно завершилась.