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

3

C++ ソース コードは ASCII です。Unicode 文字を入力しています。比較は 8 ビット値を使用して行われています。母音の 1 つが次の条件を満たしているに違いありません:-

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

これを行うには、ASCII 関数ではなく、Unicode 関数を使用する必要があります。つまり、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 に準拠していないプログラムで使用されるロケールです。コントロール パネルの [地域の設定] にあります。

wstringまたは、 andwchar_tおよびL""string/char リテラルを使用するように書き直してください。

于 2013-05-16T14:52:53.680 に答える