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

C++将字符串转换为TCHAR *,c++,visual-c++,mfc,C++,Visual C++,Mfc,下面是我的代码: 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; 我明白了: 我不明白为什

下面是我的代码:

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;
我明白了:


<>我不明白为什么我要得到额外的字符,如何解决它?

你忘记提供空间并添加一个终止零。

你忘了提供空间并添加一个终止零。

在处理C和C++中的字符串char *变体时,需要小心。要求它们在和处具有终止0,而您没有为其提供空间

TCHAR* wArr = new TCHAR[size+1];
...
/*add a terminating zero after the loop*/
wArr[size] = 0;
它会像预期的那样工作


也可以避免这样的裸露字符操作。

在处理C和C++中字符串的char *变体时,需要小心。要求它们在和处具有终止0,而您没有为其提供空间

TCHAR* wArr = new TCHAR[size+1];
...
/*add a terminating zero after the loop*/
wArr[size] = 0;
它会像预期的那样工作

此外,如果可以,请避免此类裸字符*操作。

前言:

不应使用新代码。它们是在90年代发明的,用于简化从ANSI系统Win9x到Unicode系统Windows NT的代码移植。TCHAR扩展为由UNICODE和UNICODE预处理器符号控制的char或wchar。 不要使用TCHAR,除非您必须支持Win9x

分析:

你让这条路变得更复杂了。因为这个代码

TCHAR* wArr = ...;
cout << wArr << endl;
如果这真的是您想要的,我怀疑它是,那么如果您需要一个可变字符串,简单地调用就足够了

建议的解决方案:

在整个过程中使用Unicode。如果您使用的是字符串文字,以下内容可以解决您的直接问题

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

不应使用新代码。它们是在90年代发明的,用于简化从ANSI系统Win9x到Unicode系统Windows NT的代码移植。TCHAR扩展为由UNICODE和UNICODE预处理器符号控制的char或wchar。 不要使用TCHAR,除非您必须支持Win9x

分析:

你让这条路变得更复杂了。因为这个代码

TCHAR* wArr = ...;
cout << wArr << endl;
如果这真的是您想要的,我怀疑它是,那么如果您需要一个可变字符串,简单地调用就足够了

建议的解决方案:

在整个过程中使用Unicode。如果您使用的是字符串文字,以下内容可以解决您的直接问题

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

您需要添加终止的空字符wArr[size]='\0';。显然,您需要声明TCHAR*wArr=newtchar[size+1];别这样。不要使用微软讨厌的TCHAR。它支持为Windows 9x提供有限功能版本的程序,并且在2000年引入Layer for Unicode后,它已经过时。自从微软停止对Windows2000和更早版本的工具支持以来,所有这些东西都已经过时了。因此,这是一种过时的技术,现在又被一种过时的技术所取代,解决了一个你必须回到过去才能遇到的问题。你需要添加终止的空字符wArr[size]='\0';。显然,您需要声明TCHAR*wArr=newtchar[size+1];别这样。不要使用微软讨厌的TCHAR。它支持为Windows 9x提供有限功能版本的程序,并且在2000年引入Layer for Unicode后,它已经过时。自从微软停止对Windows2000和更早版本的工具支持以来,所有这些东西都已经过时了。因此,这是一种过时的技术,现在又被一种过时的技术所取代,解决了一个你必须回到过去才能遇到的问题。