フォーマットされた文字列を単一の 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 では正しく動作しません。これに対する回避策はありますか?