кириллица — соответствующие русские гласные в переполнении стека

Я хотел написать функцию, которая возвращает 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

Кажется, есть какой-то внутренний механизм, которого я пока не знаю. Сначала меня интересует, как исправить эту функцию для правильной работы. И во-вторых, что там происходит, что я получаю этот результат.

5

Решение

string а также char гарантированно представляют символы только в базовом наборе символов, который не включает кириллицу.

С помощью wstring а также wchar_tи добавление L перед строковыми и символьными литералами, чтобы указать, что они используют широкие символы, должно позволить вам работать с этими буквами.

Также для мобильности нужно включить <algorithm> за find, и дать main тип возврата int,

8

Другие решения

Исходный код C ++ — ASCII. Вы вводите символы Юникода. Сравнение выполняется с использованием 8-битных значений. Бьюсь об заклад, один из гласных выполняет следующее: —

vowel & 255 == (code point for 'Ж') & 255

Для этого вам нужно использовать функции Юникода, а не функции ASCII, то есть использовать функции, которые требуют значений wchar_t. Кроме того, убедитесь, что ваш компилятор может анализировать строку гласных, отличную от ASCII. Используя MS VC, компилятор требует:

L"аяё×эеуюыи" or TEXT("аяё×эеуюыи")

последний является макросом, который добавляет L при компиляции с поддержкой юникода.

Преобразуйте код для использования wchar_t, и он должен работать.

3

Очень полезная функция в locale.h

setlocale(LC_ALL, "Russian");

Прошлое это в начале программы.
Пример:

#include <stdio.h>
#include <locale.h>

void main()
{
setlocale(LC_ALL, "Russian");

printf("Здравствуй, мир!\n");//Hello, world!
}
2

Убедитесь, что в вашей системе по умолчанию используется русский язык, и убедитесь, что ваш файл сохранен как кодовая страница 1251 (кириллица / Windows). Если это сохранено как Unicode, это никогда не будет работать.

Системный языковой стандарт по умолчанию — тот, который используется не-Unicode-совместимыми программами. Это в панели управления, в региональных настройках.

В качестве альтернативы переписать для использования wstring а также wchar_t а также L"" строковые / символьные литералы.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector