Я хотел написать функцию, которая возвращает true, если данный символ является русским гласным. Но результаты, которые я получаю, странны для меня. Вот что у меня так далеко:
#include <iostream>
using namespace std;
bool is_vowel_p(char working_char)
// returns true if the character is a russian vowel
{
string matcher = "аяё×эеуюыи";
if (find(matcher.begin(), matcher.end(), working_char) != matcher.end())
return true;
else
return false;
}void main()
{
cout << is_vowel_p('е') << endl; // russian vowel
cout << is_vowel_p('Ж') << endl; // russian consonant
cout << is_vowel_p('D') << endl; // latin letter
}
Результат:
1
1
0
что странно для меня Я ожидал следующий результат:
1
0
0
Кажется, есть какой-то внутренний механизм, которого я пока не знаю. Сначала меня интересует, как исправить эту функцию для правильной работы. И во-вторых, что там происходит, что я получаю этот результат.
string
а также char
гарантированно представляют символы только в базовом наборе символов, который не включает кириллицу.
С помощью wstring
а также wchar_t
и добавление L
перед строковыми и символьными литералами, чтобы указать, что они используют широкие символы, должно позволить вам работать с этими буквами.
Также для мобильности нужно включить <algorithm>
за find
, и дать main
тип возврата int
,
Исходный код C ++ — ASCII. Вы вводите символы Юникода. Сравнение выполняется с использованием 8-битных значений. Бьюсь об заклад, один из гласных выполняет следующее: —
vowel & 255 == (code point for 'Ж') & 255
Для этого вам нужно использовать функции Юникода, а не функции ASCII, то есть использовать функции, которые требуют значений wchar_t. Кроме того, убедитесь, что ваш компилятор может анализировать строку гласных, отличную от ASCII. Используя MS VC, компилятор требует:
L"аяё×эеуюыи" or TEXT("аяё×эеуюыи")
последний является макросом, который добавляет L
при компиляции с поддержкой юникода.
Преобразуйте код для использования wchar_t, и он должен работать.
Очень полезная функция в locale.h
setlocale(LC_ALL, "Russian");
Прошлое это в начале программы.
Пример:
#include <stdio.h>
#include <locale.h>
void main()
{
setlocale(LC_ALL, "Russian");
printf("Здравствуй, мир!\n");//Hello, world!
}
Убедитесь, что в вашей системе по умолчанию используется русский язык, и убедитесь, что ваш файл сохранен как кодовая страница 1251 (кириллица / Windows). Если это сохранено как Unicode, это никогда не будет работать.
Системный языковой стандарт по умолчанию — тот, который используется не-Unicode-совместимыми программами. Это в панели управления, в региональных настройках.
В качестве альтернативы переписать для использования wstring
а также wchar_t
а также L""
строковые / символьные литералы.