Удалить все символы в строке, не являющиеся буквами - C (СИ)
Формулировка задачи:
Удалить все символы в строке, не являющиеся буквами, а также
заменить множественные пробелы одним.
Решение задачи: «Удалить все символы в строке, не являющиеся буквами»
textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
char* ch_remove(char* s, int (*pfn)(const char*)){
char* p1, *p2;
for(p1 = p2 = s; *p1; *p1 = *(++p2)){
if(! (*pfn)(p2))
++p1;
}
return s;
}
static int cmp(const char* s){
return (! isalpha(*s) && ! isspace(*s)) ||
((*s == ' ') && (*s == *(s + 1)));
}
int main(void){
char s[] = ",...[]]]dog, fox, [bat], {{{{cat},,,, fin..";
puts( ch_remove(s, cmp) );
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: iostream.h и ctype.h
- Определяется функция с именем ch_remove, которая принимает два аргумента: указатель на строку и функцию-предикат.
- Внутри функции ch_remove объявляются две переменные: p1 и p2, которые будут использоваться в цикле.
- Инициализируются значения p1 и p2, где p1 указывает на первый символ строки, а p2 - на второй.
- Запускается цикл, который будет выполняться до тех пор, пока есть символы в строке.
- Внутри цикла проверяется, является ли текущий символ буквой. Если нет, то он удаляется из строки, инициализируя p1 следующим символом.
- После цикла возвращается исходная строка.
- Определяется статическая функция cmp, которая принимает указатель на строку и возвращает значение, определяющее, является ли символ буквой или пробелом.
- В функции cmp проверяется, является ли текущий символ буквой или пробелом. Если нет, то возвращается значение, которое позволяет функции ch_remove удалить этот символ.
- В функции main определяется строка s, которая содержит набор символов для обработки.
- Вызывается функция ch_remove, передавая ей в качестве аргументов строку s и функцию cmp.
- Выводится результат работы функции ch_remove.
- Функция main возвращает 0, что означает успешное завершение работы программы.