2

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に変換する正しい方法ですか?それ以来、私は別の方法を知るようになりました。しかし、なぜ上記のコードがそのように機能するのか知りたいのですが?

4

3 に答える 3

11

mbtowc1文字のみを変換します。使うつもりでしたmbstowcsか?

通常、この関数を2回呼び出します。1つ目は必要なバッファサイズを取得し、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()

于 2010-12-20T18:00:08.360 に答える
2

なぜCコードを使用しているのか、そしてもっと移植性の高い方法でそれを書いてみませんか。たとえば、ここで行うのはSTLを使用することです。

std::string  src = std::string("C:\\user") +
                   std::string(" 1");
std::wstring dne = std::wstring(src.begin(), src.end());

wcout << dne;

とてもシンプルで簡単です:D

于 2010-12-22T03:40:04.057 に答える
0

L「HelloWorld」

文字列の前にある接頭辞Lは、ワイド文字列になります。

于 2010-12-20T18:00:55.537 に答える