Форум программистов, компьютерный форум CyberForum.ru

Аналог функции isalpha() (<cctype>) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
DPS
 Аватар для DPS
32 / 32 / 3
Регистрация: 12.11.2011
Сообщений: 107
Завершенные тесты: 1
16.12.2013, 19:28     Аналог функции isalpha() (<cctype>) #1
Здравствуйте) Я так понял, функция isalpha() не работает с русскими буквами(?), пришлось написать свою версию для работы с русскими символами.
Посмотрите, пожалуйста, если будет время мой код(нормально ли он работает?). Правильно ли создавать две версии функции - для char и для unsigned char, или вообще можно как-то заставить работать функцию isalpha() с русскими буквами?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include<iostream>
#include<conio.h>       //для getch()
#include<Windows.h>     //SetConsoleTextAttribute
#include<iomanip>       //для setw()
 
using namespace std;
 
//ширина полей вывода
const size_t MAX1 = 4;      
const size_t MAX2 = 2;
 
//функции, определяющие, является ли символ буквой
//если символ - буква, возвращают true
//поскольку коды ansi у знаковых и беззнаковых различаются символов, 
//необходимо создать две функции
bool letter(char ch);
bool letter(unsigned char ch);      //перегруженная
 
 
 
int main()
{
    char ch_1           = 0;        //знаковая переменная
    unsigned char ch_2  = 0;        //и беззнаковая
 
    int counter = 0;        //счетчик, если == 4, переход на новую строку
 
    //если символ - буква, будем разукрашивать его зеленым)
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(handle, 15);                //ставим белый цвет на черном фоне
 
    //сначала проверяем тип char
 
    cout << "**********************************************************************" << endl;
    cout << "**************************char****************************************" << endl;
    cout << "**********************************************************************" << endl;
    cout << endl;
 
    do{
        if( letter(ch_1) )                              //если символ - буква
        {
            SetConsoleTextAttribute(handle, 266);       //разукрашиваем зеленым
        }
        else
            SetConsoleTextAttribute(handle, 15);        //если нет, оставляем белый 
 
        cout << setw(MAX1) << static_cast<int>(ch_1) << " - " << setw(MAX2) << ch_1 << "\t";
        
        ++ch_1;
        ++counter;
 
        if(counter == 4)
        {
            counter = 0;
            cout << endl;
        }
    }while(ch_1);
 
    
    //а теперь проверяем тип unsigned char
    counter = 0;        //обнуляем счетчик
 
    cout << "**********************************************************************" << endl;
    cout << "****************unsigned char****************************************" << endl;
    cout << "**********************************************************************" << endl;
    cout << endl;
 
    do{
        if( letter(ch_2) )                              //если символ - буква
        {
            SetConsoleTextAttribute(handle, 266);       //разукрашиваем зеленым
        }
        else
            SetConsoleTextAttribute(handle, 15);        //если нет, оставляем белый 
 
        cout << setw(MAX1) << static_cast<int>(ch_2) << " - " << setw(MAX2) << ch_2 << "\t";
        
        ++ch_2;
        ++counter;
 
        if(counter == 4)
        {
            counter = 0;
            cout << endl;
        }
    }while(ch_2);
 
 
    _getch();
 
    return 0;
}
 
 
 
 
bool letter(char ch)            //функция для знакового char
{
    if( (ch >= 65) && (ch <= 90) || (ch >= 97) && (ch <=122) )              //проверяем англ. буквы
        return true;
    else if( (ch >= -128) && (ch <= -81) || (ch >= -32) && (ch <= -15) )    //и русские
        return true; 
    else
        return false;                                                       //если не буква -> false
}
 
 
bool letter(unsigned char ch)   //перегруженная для беззнакового char
{
    if( (ch >= 65) && (ch <= 90) || (ch >= 97) && (ch <=122) )              //проверяем англ. буквы
        return true;
    else if( (ch >= 128) && (ch <= 175) || (ch >= 224) && (ch <= 241) )     //и русские
        return true; 
    else
        return false;                                                       //если не буква -> false
}
Миниатюры
Аналог функции isalpha() (<cctype>)   Аналог функции isalpha() (<cctype>)  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2013, 19:28     Аналог функции isalpha() (<cctype>)
Посмотрите здесь:

C++ Cctype
isalpha и isprint C++
Есть ли аналог isalpha, только для string C++
C++ Какой есть аналог isalpha для работы с русским алфавитом?
C++ Написать программу с использованием функции cctype
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
16.12.2013, 19:31     Аналог функции isalpha() (<cctype>) #2
Цитата Сообщение от DPS Посмотреть сообщение
Здравствуйте) Я так понял, функция isalpha() не работает с русскими буквами(?), пришлось написать свою версию для работы с русскими символами.
Не нужно с кодами символов работать .
Функция isalnum() не работает с кириллицей?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
16.12.2013, 19:33     Аналог функции isalpha() (<cctype>) #3
А isalpha из <locale> не работает?
DPS
 Аватар для DPS
32 / 32 / 3
Регистрация: 12.11.2011
Сообщений: 107
Завершенные тесты: 1
16.12.2013, 19:56  [ТС]     Аналог функции isalpha() (<cctype>) #4
Цитата Сообщение от gray_fox Посмотреть сообщение
А isalpha из <locale> не работает?
Спасибо, такой функции не видел... А как использовать-то ее?) Я так понимаю, подключаем
C++
1
#include <locale>
, но второй параметр что-то непонятен для меня. Чем его инициализировать? Поясните пожалуйста, gray_fox, каким он должен быть, а лучше список значений, которые можно применить.

Я использовал функцию, как показано ниже, и у меня вывелись только английские буквы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    
 
 
char ch_1           = 0;        //знаковая переменная
 
    std::locale loc;
 
    do{
        if(isalpha(ch_1, loc))                         //если буква, выводим на экран
            cout << ch_1 << endl;
 
        ++ch_1;
    }while(ch_1);
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
16.12.2013, 20:15     Аналог функции isalpha() (<cctype>) #5
DPS, там по ссылке есть пример:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <locale>
 
int main()
{ 
    const wchar_t c = L'\u042f'; // cyrillic capital letter ya
 
    std::locale loc2("en_US.UTF8");
    std::cout << "isalpha('Я', Unicode locale) returned "
              << std::boolalpha << std::isalpha(c, loc2) << '\n';
}
http://ideone.com/MsJexz
Другое дело, что может такой локали (с UTF-8) в системе и нет.
Я этими функциями сам никогда не пользовался, но вроде как они для этого и предназначены (локализация).

Добавлено через 5 минут
Цитата Сообщение от DPS Посмотреть сообщение
Я использовал функцию, как показано ниже, и у меня вывелись только английские буквы.
Потому что объект std::locale, сконструированный конструктором по умолчанию - это то же самое, что и глобальная locale, которая по умолчанию C-locale, которая используется в функциях из <cctype>... вроде так)

Добавлено через 4 минуты
Т.е. ещё можно поменять "Сишную" locale и использовать функции из <cctype>
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <clocale>
#include <cctype>
 
 
int main()
{ 
    const wchar_t c = L'\u042f'; // cyrillic capital letter ya
    
    std::setlocale(LC_ALL, "en_US.UTF8");
    std::cout << "isalpha('Я') returned "
              << std::boolalpha << std::iswalpha(c) << '\n';
}
http://ideone.com/H95eSS
DPS
 Аватар для DPS
32 / 32 / 3
Регистрация: 12.11.2011
Сообщений: 107
Завершенные тесты: 1
16.12.2013, 20:25  [ТС]     Аналог функции isalpha() (<cctype>) #6
gray_fox, спасибо за разъяснения. Вот у Вас везде используется тип wchar_t, я все же хотел с обычными char и unsigned char разобраться) Никогда не обращал внимания на wchar_t, придется, видимо, научиться пользоваться его)
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
16.12.2013, 20:41     Аналог функции isalpha() (<cctype>) #7
Цитата Сообщение от DPS Посмотреть сообщение
Вот у Вас везде используется тип wchar_t, я все же хотел с обычными char и unsigned char разобраться) Никогда не обращал внимания на wchar_t, придется, видимо, научиться пользоваться его)
Я им сам никогда не пользовался, т.к. локализация - та ещё морока) Там ещё могут быть причины, почему то, что я писал, у вас работать не будет - кодировка консоли, у wchar_t размер не фиксированный и пр.

Добавлено через 4 минуты
Просто если брать UTF8 - то там размер символа может быть от одного до 4 байт, хранить строки можно и массиве char\string, но тогда каждый элемент будет представлять не символ, а code point. С wchar_t возможно получиться работать, как с обычными символами, но я, вообще говоря, здесь уже сам не знаю.

Добавлено через 7 минут
Вот пример с вводом и выводом символов: http://ideone.com/RFJLh0
Этот код у меня выполняется, так, как и ожидается, но я лично не знаю, будет ли это работать везде.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2015, 00:15     Аналог функции isalpha() (<cctype>)
Еще ссылки по теме:

C++ Неполадки с isalpha
использование cctype C++
C++ Функции <cctype>

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Gennadi
1 / 1 / 0
Регистрация: 06.07.2015
Сообщений: 5
20.09.2015, 00:15     Аналог функции isalpha() (<cctype>) #8
Работает обычная "исалфа" (!!!) Тольно нужно использовать не char а unsigned char!

Добавлено через 14 минут
Всё работает с isalnum(Ch) только обязательно нужно использовать локаль! Я пишу так:
SetConsoleCP(1251); // подключение кириллицы
SetConsoleOutputCP(1251); // подключение кириллицы
setlocale(LC_ALL, "")
Без 1 и 2 строки работает некорректно
Yandex
Объявления
20.09.2015, 00:15     Аналог функции isalpha() (<cctype>)
Ответ Создать тему
Опции темы

Текущее время: 20:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru