C ++将字符串转换为TCHAR *

时间:2016-06-21 04:12:03

标签: c++ visual-c++ mfc

以下是我的代码:

$line

我明白了:

enter image description here

我不明白为什么我会得到额外的角色,以及如何解决它?

3 个答案:

答案 0 :(得分:2)

您忘了为空间提供空间并添加终止零。

答案 1 :(得分:2)

<强>前言

新代码不应使用Generic-Text Mappings。它们是在90年代发明的,以便于将代码从ANSI系统(Win9x)移植到Unicode系统(Windows NT)。 TCHAR扩展为由charwchar_t预处理器符号控制的UNICODE_UNICODE
请勿使用TCHAR,除非您必须支持Win9x。

<强>分析:

你这样做比现在更复杂。由于此代码

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

将字符串写入cout(相对于指针值),您尚未定义预处理程序符号UNICODE_UNICODE。换句话说:您正在使用MBCS字符编码(请参阅Unicode and 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()

答案 2 :(得分:0)

在C和C ++中使用字符串的char *变体时需要小心。他们需要终止0,并且你没有为它提供空间

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

它可以按预期工作。

另外,如果可以,请避免使用这种裸char *操作。