1

フォーマットされた文字列を単一の wchar_t* に変換しています。%s を含むストリームがある場合、vswprintf はどういうわけか、その書式設定された文字列から予想される wchar_t* を形成しません。これは Windows (VS 2008) でのみ発生しますが、Mac (XCode 3.2.6) ではうまく機能します。

例えば、

私のフォーマット機能:

void widePrint(const wchar_t* fmt, ...) { 
    va_list args;
    va_start(args, fmt);

    wchar_t buf[32*1024] = {0};

    vswprintf(buf,(32*1024 - 1),fmt, args);

    ...//Prints buf 
    ...
}

これは Windows では機能しませんが、Mac ではうまく機能します

std::string normalStr = "test Str";

std::wstring wideStr = L"wide test Str";

widePrint("Normal One: %s and Wide One: %ls", normalStr .c_str(), wideStr .c_str());

しかし、%s を %ls に変換すると、std::string を std::wstring に変換することは Windows でも確実に機能します。

std::string normalStr = "test Str";

std::wstring normalStrW(normalStr .begin(), normalStr .end());

std::wstring wideStr = L"wide test Str";

widePrint("Normal One: %ls and Wide One: %ls", normalStrW.c_str(), wideStr .c_str());

オンラインで検索すると、このクエリが Stack Overflow で表示されます

しかし、そのリンクでさえ解決策がありません。すべての std::strings を std::wstrings に変換するこの状況を取り除く方法。実際、変換はコストのかかる操作です。

編集: "%S" -> Capital S は、vswprintf で char* を印刷するのに確かに役立ちます。この以下のコードは機能します。

widePrint("Normal One: %S", normalStr.c_str());

しかし、残念ながら「%S」は Mac では正しく動作しません。これに対する回避策はありますか?

4

0 に答える 0