isalpha
функция спрашивает the question: функция
ISALPHA() должен проверить с, является ли символ класса альфа в текущей локали программы.
и продолжает отмечать:
С аргументом является INT, значение которого приложение должны обеспечить представимо как неподписанный символ или равно значение макроса EOF. Если аргумент имеет любое другое значение, поведение не определено.
Это означает, что он работает только для символов ascii.
Тест в значительной степени является символом в диапазонах [A-Z]
или [a-z]
, ничего более.
Noe, если вы хотите проверить символы за пределами этого диапазона, вам необходимо использовать один из широких вариантов символов, например iswalpha.
Как вы думаете, вы можете выполнить тест, который будет отклонять символы, которые не являются явными кириллическими буквами? Это не будет работать с тестом iswalpha()
, потому что он принимает все альфа-символы из почти всех наборов символов являются альфа-символами - если вы читаете локальное определение ru_RU (glibc-источник localedata/locales/ru_RU
), в котором используется файл i18n
, поскольку он является источником данных для типов символов определяет, что считается альфой.
Если входные данные действительно только from the russian alphabet, то вы можете проверить, не является ли символ не ascii, и если это так, то принимайте его как допустимый символ; к сожалению, есть хорошая вероятность, что некоторые символы, которые напечатаны, например, е
(т. Е. CYRILLIC SMALL LETTER IE Unicode: U + 0435, UTF-8: D0 B5) будет введен с использованием латинского символа e
(т.е. LATIN SMALL LETTER E Unicode: U + 0065, UTF-8: 65), и так будет пропустил этот тест.
если вы хотите проверить эти кириллицы явно, то вам необходимо проверить для диапазонов символов:
% CYRILLIC/
<U0400>..<U042F>;<U0460>..(2)..<U047E>;/
<U0480>;<U048A>..(2)..<U04BE>;<U04C0>;<U04C1>..(2)..<U04CD>;/
<U04D0>..(2)..<U04FE>;/
% CYRILLIC SUPPLEMENT/
<U0500>..(2)..<U0522>;/
% CYRILLIC SUPPLEMENT 2/
<UA640>..(2)..<UA65E>;<UA662>..(2)..<UA66C>;<UA680>..(2)..<UA696>;/
% CYRILLIC/
<U0430>..<U045F>;<U0461>..(2)..<U047F>;/
<U0481>;<U048B>..(2)..<U04BF>;<U04C2>..(2)..<U04CE>;/
<U04CF>;/
<U04D1>..(2)..<U0523>;/
% CYRILLIC SUPPLEMENT 2/
<UA641>..(2)..<UA65F>;<UA663>..(2)..<UA66D>;<UA681>..(2)..<UA697>;/
ммм, да, вы правы. Я забыл сказать об iswalpha() для wchar_t. Я использую их. – dmigous
Вы должны использовать 'isspace' /' iswspace' в этом случае в качестве дополнительного теста – Petesh
iswspace с символом ввода 'e' вернет true? Мне нужно отфильтровать кроме алфавитных символов текущей локали – dmigous