Удаление всех символов кроме русских букв и дефиса - 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, что означает успешный конец работы программы.