Функция Delete(s1, s2): удалить из строки s1 все символы, встречающиеся в строке s2 - C (СИ)
Формулировка задачи:
Написать и протестировать функцию Delete(s1, s2), которая удаляет из строки s1
все символы, встречающиеся в строке s2
Решение задачи: «Функция Delete(s1, s2): удалить из строки s1 все символы, встречающиеся в строке s2»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
char * del1(char * from, const char * what) {
char * ret = from;
while ( ( from = strpbrk(from, what) ) != NULL )
memmove(from, from + 1, strlen(from));
return ret;
}
char * del2(char * from, const char * what) {
while ( *from && strchr(what, *from) )
memmove(from, from + 1, strlen(from));
if ( *from )
del2(from + 1, what);
return from;
}
int main(void) {
char from1[] = "any many money more";
char from2[] = "any many money more";
printf("del1: %s\n", del1(from1, "ane"));
printf("del2: %s\n", del2(from2, "ane"));
return 0;
}
Объяснение кода листинга программы
В данном коде представлены две функции для удаления подстроки из строки: del1 и del2.
- Функция del1:
— Входит в состав библиотеки
и . — Вызывает сбивание (confusion) при чтении кода из-за непонимания работы функции strpbrk. — Функция начинает работу с инициализации переменной ret тем же значением, что и входной параметр from. — Использует функцию strpbrk для поиска первого символа из подстроки what в строке from. — Если такой символ найден, функция перемещает все символы в from начиная с этого символа на 1 позицию вперед (т.е. пропускает этот символ) и возвращает новое значение from. — Если strpbrk вернула NULL (т.е. не было найдено ни одного символа из подстроки what), то функция возвращает исходное значение from. - Функция del2:
— Входит в состав библиотеки
и . — Использует цикл while для проверки каждого символа в строке from. — Если текущий символ из подстроки what, то он пропускается (перемещается на 1 позицию вперед) с помощью функции memmove. — Если текущий символ не является символом из подстроки what, то он остается на своем месте. — Если текущий символ является последним в строке (т.е. *from == '\0'), то функция заканчивает свою работу. — Если текущий символ не является последним в строке и он является символом из подстроки what, то функция вызывает сама себя (рекурсия) для обработки оставшейся части строки. - В функции main создаются две строки: from1 и from2.
— Значение from1:
any many money more. — Значение from2:any many money more. — Вызывается функция del1 с аргументами from1 иane. — Вызывается функция del2 с аргументами from2 иane. — Выводится результат работы функций на экран. Примечание: данный код может вызвать неопределенное поведение (UB), если входная строка будет содержать символы, не входящие в подстроку what.