2016-06-21 3 views
1

が私のコードである* TCHARに文字列を変換しますC++以下

string szDllPath = "12345"; 
size_t size = szDllPath.length(); 
TCHAR* wArr = new TCHAR[size]; 
for (size_t i = 0; i < size; ++i) 
    wArr[i] = _T(szDllPath[i]); 

cout<<szDllPath<<endl; 
cout<<wArr<<endl; 

そして、私はこの取得:

enter image description here

を私は余分な文字を取得する理由を理解し、どのようにしていませんそれを解決する?

+0

を終了するヌル文字 'wArr [size] = '\ 0';'を追加する。明らかに 'TCHAR * wArr = new TCHAR [size + 1];を宣言する必要があります。 – chema989

+4

** **はありません。マイクロソフトの「TCHAR」偽名を使用しないでください。これは、Windows 9x用の限定された機能バージョンのプログラムを提供するためのサポートであり、2000年にはすでにUnicode用レイヤーが導入されています。 MicrosoftはWindows 2000以前のツールのサポートを中止して以来、すべてのものが順番に廃止されました。だから、これは廃止されたテクノロジーであり、現在では廃止されたテクノロジに置き換えられ、遭遇する時間に戻って旅しなければならない問題に取り組んでいます。 –

答えて

2

終了ゼロを入力するスペースを追加して忘れてしまった。

0

CおよびC++で文字列のchar *バリアントを扱うときは、注意が必要です。それらはandで終了する0を持つ必要があります。また、スペースを提供していません。

TCHAR* wArr = new TCHAR[size+1]; 
... 
/*add a terminating zero after the loop*/ 
wArr[size] = 0; 

期待どおりに動作します。

また、可能であれば、このような裸のchar *操作は避けてください。

2

序文:

新しいコードはGeneric-Text Mappingsを使用すべきではありません。それらは、ANSIシステム(Win9x)からUnicodeシステム(Windows NT)へのコード移植を容易にするために90年代に考案されました。 TCHARは、UNICODE_UNICODEのプリプロセッサシンボルによって制御されるcharまたはwchar_tのいずれかに展開されます。
Win9xをサポートする必要がない限り、TCHARは使用しないでください。

分析:

あなたはそれがあるよりも、この方法はより複雑になっています。このコード

TCHAR* wArr = ...; 
cout << wArr << endl; 

ので、あなたはプリプロセッサシンボルUNICODEまたは_UNICODE定義していない(ポインタ値対)coutに文字列を書き込みます。言い換えれば:あなたは、同じ出力を生成する(Unicode and MBCSを参照)MBCS文字エンコーディングを使用して、次のとおりです。

string szDllPath = "12345"; 
cout << szDllPath.c_str() << endl; 

それはあなたが望む本当に(と私はそれがある疑う)場合は、単純にstd::basic_string::cstr()をされて呼び出すと、十分です(可変文字列が必要な場合はstd::basic_string::data()を使用してください)。

推奨ソリューション:

Unicodeを使用を通して。文字列リテラルを使用している場合、次のようにすればすぐに問題は解決します。

wstring szDllPath = L"12345"; 
wcout << szDllPath.c_str() << endl; 

リテラル文字列を使用していないとワイド文字列にstd::stringから変換する必要がない場合は、変換を実行するためにMFCのCStringクラスを使用することができます:あなたが必要

CStringW wideString(szDllPath.c_str()); // Conversion c'tor, taking a const char* 
const wchar_t* = (LPCWSTR)wideString; // Invoke operator LPCWSTR()