0

私が持っているもの:

  • [wstr1] 1 std :: wstring value(eg "(GMT + 04:30)Kabul")
  • [str2] std :: wstringと同じデータで満たされた1文字* (同じテキスト)

この2つの値を比較しようとしていますが、次のコードは機能していないようです。KMP。

これがchar*からstd::wstringへのコンバーターです。

std::wstring TimeZone::TimeZone::char2ws(const char* src)
{
    /* Convert to a wchar_t*
     * http://msdn.microsoft.com/en-us/library/ms235631(v=vs.80).aspx
     */

    // Convert to a wchar_t*
    size_t origsize = strlen(src) + 1;
    const size_t newsize = 512;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(&convertedChars, wcstring, origsize, src, _TRUNCATE);

    return wcstring;
}

その後、私は簡単に比較しました

// wstr1 is std::wstring, with "(GMT+04:30) Kabul" string
// wstr2 = char2ws(str2), 
return (wstr1 == wstr2);

そして運がない。VSVC2008IDEデバッガーの文字列は視覚的に同じです。

質問:compareメソッドが常にfalseを返すのはなぜですか?

ありがとう。


解決策: AlexandreCに感謝します。

bool weirdEquals(const std::wstring& str, char const* c)
{
    std::string c_str(c);
    if (str.size() < c_str.size())
    {
        return false;
    }
    return std::equal(c_str.begin(), c_str.end(), str.begin());
}

PS。いくつか変更を加えました。

4

3 に答える 3

1

文字列を比較するには、同じ文字セットを使用して文字列を比較する必要があります。wchar_t明らかにchar異なる文字セットを使用しているため、通常の文字ごとの文字列比較を使用してそれらを比較することはできません。

通常、文字列を(またはを使用して)文字char*列に変換して、両方をUnicode文字列として比較できるようにします。wchar_t*mbtowcsMultiByteToWideChar

しかし、あなたの場合は、単純なASCII文字が一致することだけを期待していると思います。その場合、wchar_tsとsを比較して、文字ごとの比較を行うことができますchar。注:これを行うためにキャストを使用しないでください。

変換が機能しない理由については、@Erikの回答を参照してください。

于 2011-02-21T16:08:43.570 に答える
1

ASCII文字しかないことが確実な場合は、このように比較してください。それ以外の場合は、カスタム(ロケールに依存する?)比較子をに渡すことができますstd::equal

bool weirdEquals(char const* c, size_t n, const std::wstring& str)
{
    if (str.size() < n) return false;
    return std::equal(c, c + n, str.begin());
}
于 2011-02-21T16:36:17.267 に答える
0

mbstowcs_sに渡す必要があります。渡す必要はありnewsizeませんorigsize

また、以下の使用を検討してください。

wchar_t wcstring[newsize] = { 0 };
于 2011-02-21T16:03:54.210 に答える