答案 0 :(得分:2)
您忘了为空间提供空间并添加终止零。
答案 1 :(得分:2)
<强>前言强>
新代码不应使用Generic-Text Mappings。它们是在90年代发明的,以便于将代码从ANSI系统(Win9x)移植到Unicode系统(Windows NT)。 TCHAR
扩展为由char
和wchar_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 *操作。