我想编写一个函数,如果给定的字符是俄语元音,则返回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
似乎有某种内部机制我还不知道。我最初对如何修复此功能以使其正常工作感兴趣。第二,那里发生了什么,我得到了这个结果。
答案 0 :(得分:8)
string
和char
仅保证代表基本字符集中的字符 - 不包括西里尔字母。
使用wstring
和wchar_t
,并在字符串和字符文字之前添加L
以表明它们使用宽字符,应该允许您使用这些字母。
另外,为了便于携带,您需要为<algorithm>
添加find
,并为main
提供int
的返回类型。
答案 1 :(得分:3)
C ++源代码是ASCII。您正在输入unicode字符。使用8位值进行比较。我打赌其中一个元音符合以下要求: -
vowel & 255 == (code point for 'Ж') & 255
您需要使用unicode函数来执行此操作,而不是使用ASCII函数,即使用需要wchar_t值的函数。另外,请确保您的编译器可以解析非ASCII元音字符串。使用MS VC,编译器需要: -
L"аяё×эеуюыи" or TEXT("аяё×эеуюыи")
后者是一个在使用unicode支持进行编译时添加L
的宏。
将代码转换为使用wchar_t,它应该可以工作。
答案 2 :(得分:2)
locale.h中非常有用的功能
setlocale(LC_ALL, "Russian");
在程序开始时过去这个。 例如:
#include <stdio.h>
#include <locale.h>
void main()
{
setlocale(LC_ALL, "Russian");
printf("Здравствуй, мир!\n");//Hello, world!
}
答案 3 :(得分:1)
确保您的系统默认语言环境是俄语,并确保您的文件保存为代码页1251(西里尔语/ Windows)。如果它保存为Unicode,则无法使用。
系统默认语言环境是非Unicode兼容程序使用的语言环境。它位于“控制面板”中的“区域设置”下。
或者,重写以使用wstring
和wchar_t
以及L""
字符串/字符文字。