Дано предложение. Удалить из каждого слова повторяющиеся буквы - C (СИ)
Формулировка задачи:
Дано предложение. Удалить из каждого слова все повторяющиеся
буквы, т.е. в каждом слове должны остаться только различные
буквы.
Решение задачи: «Дано предложение. Удалить из каждого слова повторяющиеся буквы»
textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
//только для ascii
char* unique_abc(char* s){
unsigned int n, shf = 0;
char* p = s, *t = s;
for(; *s; *s = *++p){
if(isalpha(*p)){
n = (unsigned int)(toupper(*p) - 'A');
if(!((shf >> n) & 1)){
shf |= 1 << n;
++s;
}
} else {
++s;
shf = 0;
}
}
return t;
}
int main(void){
char s[] = "DDD, LISPSSS, ppeerrlll, GGGGGOOO.";
puts(s);
puts( unique_abc(s) );
getchar();
return 0;
}
Объяснение кода листинга программы
В данном коде реализована функция unique_abc, которая принимает в качестве аргумента строку s и возвращает новую строку, в которой удалены повторяющиеся буквы. В функции используется два указателя: p указывает на текущий символ в строке, t указывает на предыдущий символ. Алгоритм работы функции следующий:
- Проходим по каждому символу в строке.
- Если символ является буквой, то:
- Преобразуем символ в верхний регистр.
- Вычисляем номер буквы в алфавите (с учетом регистра).
- Проверяем, была ли уже в этой позиции буква. Если нет, то:
- Запоминаем текущий символ в позиции.
- Перемещаем указатель t на позицию следующего символа.
- Если символ не является буквой, то:
- Перемещаем указатель t на позицию следующего символа.
- Возвращаем новую строку, начиная с позиции t. В функции main создается тестовая строка s, которая содержит повторяющиеся буквы. Затем выводится исходная строка, после чего выводится строка, полученная с помощью функции unique_abc. Данный код работает только с символами ASCII. Если в строке будут присутствовать символы, не входящие в диапазон ASCII, то они не будут корректно обработаны.