次のC ++コード印刷が最初の文字のみを印刷するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/4492402

  •  12-10-2019
  •  | 
  •  

質問

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は、幅の広い文字列になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top