Удаление всех символов кроме русских букв и дефиса - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. Требуется удалить из строки все символы кроме русских букв и дефиса. Код:
#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++;
    }
Но предупреждение в компиляторе: [Warning] comparison between pointer and integer Вопрос: 1. Почему не работает первый вариант? 2. Что исправить что б работало? Где моя ошибка? Всем спасибо!

Решение задачи: «Удаление всех символов кроме русских букв и дефиса»

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;
}

Объяснение кода листинга программы

В этом коде удаляются все символы из введённой строки, кроме русских букв и дефиса.

  1. В первых строках подключаются необходимые библиотеки для работы с широкими символами.
  2. Далее, в функции main(), объявляются две переменные:
    • KEEP_IT — строка, которая содержит все символы, которые необходимо сохранить.
    • buf — буфер, в который считывается строка с клавиатуры.
  3. Затем, с помощью функции setlocale(), задаётся локаль, т.е. кодировка, в которой будут работать функции ввода/вывода.
  4. Далее, в цикле while считывается строка с клавиатуры и записывается в буфер buf.
  5. Внутри цикла while, для каждого символа в строке buf, проверяется, содержится ли этот символ в строке KEEP_IT.
  6. Если символ не содержится в строке KEEP_IT, то он удаляется из строки buf.
  7. После удаления всех ненужных символов, результат выводится на экран.
  8. В конце функции main() возвращается 0, что означает успешный конец работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы