次のC ++コード印刷が最初の文字のみを印刷するのはなぜですか?
質問
char文字列をwchar文字列に変換しようとしています。
さらに詳しくは、最初にchar []をwchar []に変換し、次にその文字列に「1」を追加して印刷しようとしています。
char src[256] = "c:\\user";
wchar_t temp_src[256];
mbtowc(temp_src, src, 256);
wchar_t path[256];
StringCbPrintf(path, 256, _T("%s 1"), temp_src);
wcout << path;
しかし、それはまさに印刷します c
これは、charからwcharに変換する正しい方法ですか?それ以来、私は別の方法を知るようになりました。しかし、上記のコードがそのように機能する理由を知りたいですか?
解決
mbtowc
単一の文字のみを変換します。使用するつもりでしたか mbstowcs
?
通常、この関数を2回呼び出します。必要なバッファサイズを最初に取得し、2番目が実際にそれを変換するものを取得しました。
#include <cstdlib> // for mbstowcs
const char* mbs = "c:\\user";
size_t requiredSize = ::mbstowcs(NULL, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
if(::mbstowcs(wcs, mbs, requiredSize + 1) != (size_t)(-1))
{
// Do what's needed with the wcs string
}
delete[] wcs;
むしろ使用する場合 mbstowcs_s
(非推奨の警告のため)、これを行います。
#include <cstdlib> // also for mbstowcs_s
const char* mbs = "c:\\user";
size_t requiredSize = 0;
::mbstowcs_s(&requiredSize, NULL, 0, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
::mbstowcs_s(&requiredSize, wcs, requiredSize + 1, mbs, requiredSize);
if(requiredSize != 0)
{
// Do what's needed with the wcs string
}
delete[] wcs;
必ずロケールの問題を介して注意してください setlocale() またはのバージョンを使用します mbstowcs()
(そのような mbstowcs_l()
また mbstowcs_s_l()
)それはロケールの引数を取ります。
他のヒント
なぜCコードを使用しているのですか?たとえば、ここでやろうとしていることなど、よりポータブルな方法で書いてみませんか?
std::string src = std::string("C:\\user") +
std::string(" 1");
std::wstring dne = std::wstring(src.begin(), src.end());
wcout << dne;
とても簡単で簡単です:d
l「ハローワールド」
文字列の前のプレフィックスLは、幅の広い文字列になります。
所属していません StackOverflow