5

如果给定字符是俄语元音,我想编写一个返回 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

似乎有某种我还不知道的内部机制。我起初对如何修复此功能以使其正常工作感兴趣。其次,那里发生了什么,我得到了这个结果。

4

4 回答 4

9

string并且char只保证代表基本字符集中的字符 - 不包括西里尔字母。

使用wstringandwchar_tL在字符串和字符文字之前添加以指示它们使用宽字符,应该允许您使用这些字母。

此外,为了可移植性,您需要包含<algorithm>for find,并给出main返回类型int.

于 2013-05-16T14:46:24.247 回答
3

C++ 源代码是 ASCII。您正在输入 Unicode 字符。使用 8 位值进行比较。我敢打赌其中一个元音满足以下条件:-

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

您需要使用 unicode 函数来执行此操作,而不是 ASCII 函数,即使用需要 wchar_t 值的函数。此外,请确保您的编译器可以解析非 ASCII 元音字符串。使用 MS VC,编译器需要:-

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

后者是一个宏,它L在编译时添加了 unicode 支持。

将代码转换为使用 wchar_t,它应该可以工作。

于 2013-05-16T14:48:36.403 回答
2

locale.h 中非常有用的功能

setlocale(LC_ALL, "Russian");

在程序开始时过去。例子:

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

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

    printf("Здравствуй, мир!\n");//Hello, world!
}
于 2015-04-11T04:28:51.493 回答
1

确保您的系统默认语言环境是俄语,并确保您的文件保存为代码页 1251(西里尔文/Windows)。如果它保存为 Unicode,这将永远无法工作。

系统默认语言环境是非 Unicode 兼容程序使用的语言环境。它在控制面板中的区域设置下。

或者,重写以使用wstringandwchar_tL""string/char 文字。

于 2013-05-16T14:52:53.680 回答