Удаление всех символов кроме русских букв и дефиса - C (СИ)
Формулировка задачи:
Всем доброго времени суток.
Требуется удалить из строки все символы кроме русских букв и дефиса.
Код:
Так не работает: (смотри >= 'А' в цикле)
А вот так работает:
Но предупреждение в компиляторе:
[Warning] comparison between pointer and integer
Вопрос:
1. Почему не работает первый вариант?
2. Что исправить что б работало? Где моя ошибка?
Всем спасибо!
#include <stdlib.h> #include <windows.h> #include <time.h> #define SP system("pause"); #define CP SetConsoleCP(1251); SetConsoleOutputCP(1251); #define NEWLINE putchar('\n'); #define konec system("pause"); return 0; void delspace(char *str) { int ptr=0, dest=0; char buff[100]; while(str[ptr]) { if(str[ptr] != ' ') if(str[ptr] >= "А" || str[ptr] == '-') buff[dest++] = str[ptr]; ptr++; } buff[dest] = 0; strcpy(str, buff); } void nreg(char *stroka) { int i; for(i=0; i<strlen(stroka); i++) if(stroka[i] != ' ' && stroka[i] !='-') stroka[i] = stroka[i] | 32; } void treg(char *stroka) { int i; if(stroka[0] != ' ') stroka[0] = stroka[0] & 223; for(i=0; i<strlen(stroka); i++) if((stroka[i]==' ' || stroka[i]=='-') && stroka[i+1] !=' ') stroka[i+1] = stroka[i+1] & 223; } int main() { char surname[] = "И 232 4t 23ef ва 45н 46y dfgbо 656y в"; // Вот например что-то в таком духе char name[] = "Иван"; char patronymic[] = "Иванович"; char podpis[80]; CP delspace(surname); delspace(name); delspace(patronymic); nreg(surname); nreg(name); nreg(patronymic); treg(surname); treg(name); treg(patronymic); podpis[0]=0; strcat(podpis, surname); strcat(podpis, " "); strncat(podpis, name, 1); strcat(podpis, "."); strncat(podpis, patronymic, 1); strcat(podpis, "."); podpis[strlen(surname)+5]=0; puts(podpis); NEWLINE konec }
while(str[ptr]) { if(str[ptr] != ' ') if(str[ptr] >= 'А' || str[ptr] == '-') buff[dest++] = str[ptr]; ptr++; }
while(str[ptr]) { if(str[ptr] != ' ') if(str[ptr] >= "А" || str[ptr] == '-') buff[dest++] = str[ptr]; ptr++; }
Решение задачи: «Удаление всех символов кроме русских букв и дефиса»
textual
Листинг программы
#include <stdio.h> #include <locale.h> #include <wchar.h> #include <string.h> int main(void) { const wchar_t * KEEP_IT = L"АаБбВвГгДдЕеЁёЖжЗзИиКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя-"; wchar_t buf[BUFSIZ]; setlocale(LC_ALL, "ru_RU.utf8"); while ( printf("Строка: ") && fgetws(buf, BUFSIZ, stdin) && *buf != L'\n' ) { wchar_t * p; for ( p = buf; *p != L'\0'; ++p ) { if ( ! wcschr(KEEP_IT, *p) ) { memmove(p, p + 1, sizeof(wchar_t) * wcslen(p)); --p; } } printf("Результат: %ls\n", buf); } return 0; }
Объяснение кода листинга программы
В этом коде удаляются все символы из введённой строки, кроме русских букв и дефиса.
- В первых строках подключаются необходимые библиотеки для работы с широкими символами.
- Далее, в функции main(), объявляются две переменные:
- KEEP_IT — строка, которая содержит все символы, которые необходимо сохранить.
- buf — буфер, в который считывается строка с клавиатуры.
- Затем, с помощью функции setlocale(), задаётся локаль, т.е. кодировка, в которой будут работать функции ввода/вывода.
- Далее, в цикле while считывается строка с клавиатуры и записывается в буфер buf.
- Внутри цикла while, для каждого символа в строке buf, проверяется, содержится ли этот символ в строке KEEP_IT.
- Если символ не содержится в строке KEEP_IT, то он удаляется из строки buf.
- После удаления всех ненужных символов, результат выводится на экран.
- В конце функции main() возвращается 0, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д