C++ 将TCHAR指针复制到TCHAR指针的最佳方法
我不知道为什么这看起来比实际情况更复杂!我只是想用str的内容替换str2的内容,它们都是字符串。这似乎可行,但我不确定这是正确的方法…我使用的是Visual Studio 2008 编辑:我必须为str2使用new EDIT2:我按照Michael的建议尝试了这个,但我得到了访问冲突错误: 如果您想使用TCHAR(我不确定是否推荐),请在TCHAR.h中查找为所有strxxx函数提供TCHAR等价物的宏。例如,要复制基于TCHAR的字符串,可以使用_tcscpy 实际上,许多基本运行时库函数都有TCHAR变量的宏,这些函数采用字符串或char参数,而不仅仅是strxxx函数集 因此,您的示例可以归结为:C++ 将TCHAR指针复制到TCHAR指针的最佳方法,c++,C++,我不知道为什么这看起来比实际情况更复杂!我只是想用str的内容替换str2的内容,它们都是字符串。这似乎可行,但我不确定这是正确的方法…我使用的是Visual Studio 2008 编辑:我必须为str2使用new EDIT2:我按照Michael的建议尝试了这个,但我得到了访问冲突错误: 如果您想使用TCHAR(我不确定是否推荐),请在TCHAR.h中查找为所有strxxx函数提供TCHAR等价物的宏。例如,要复制基于TCHAR的字符串,可以使用_tcscpy 实际上,许多基本运行时库函数都
TCHAR *str = _T("Hello");
TCHAR* str2 = new TCHAR[23]; // let us say this is big enough
_tcscpy( str2, str);
嗯
嗯
可以,但必须与delete[]配对
不行。覆盖指向新TCHAR的指针[23];无论出于何种目的,记忆都已消失,无法恢复
memcpy( &str2, &str, (_tcslen(str)+1)*sizeof(TCHAR));
不行。str和str2已经是指针了,所以带上它们的地址会将您指向内存中的错误位置
以上是我的观点:
#include "windows.h"
#include "TCHAR.H" // for _tcscpy_s
int main()
{
TCHAR * str = _T("Hello");
TCHAR * str2 = new TCHAR[23];
_tcscpy_s(str2, 23, _T("OK")); // store OK
_tcscpy_s(str2, 23, str); // Copy str
delete[] str2;
}
这和迈克尔·伯尔的建议差不多。唯一显著的区别是保留OK和_tcscpy_,如果我没记错的话,通过在溢出时终止程序,将副本限制为23个字符。如果终止不是您的答案,则允许截断。不知道是否有它的t版本
< C++模式>
std::wstring str(L"Hello");
std::wstring str2(L"OK");
str2 = str; // for the copy.
str2.c_str() // to get a c style string
编辑:需要在这里做一个额外的注释。C++方式与TCHAR函数不完全相同。TCHAR根据编译过程中设置的选项透明地在字符类型之间切换,以便为具有或不具有广泛字符支持的系统构建相同的源代码。这是一个非常宽的环。带L前缀的字符串是严格意义上的宽字符串。您可以对包装所有字符串和流的宏执行相同的操作,但这并不是一件小事。。。。宏 sizeofstr是其指针的大小。使用strlenstr+1。在Windows land中,您有一整套宽字符复制例程。在@DietmarKühl之后,您还丢弃了new返回的指针,因此内存泄漏,因为您现在无法删除它;所以它消失了。然后你删除了错误的一个,并试图删除一个常量。这在运行时不会很好。谢谢@Michael,以后删除str2安全吗?@Samer:\u tcscpy只是strcpy或wcscpy,取决于TCHAR是什么。因此,它对对象生命周期管理的影响与那些函数相同,即:无影响。。
TCHAR* str2;
str2 = new TCHAR[23]; // let us say this is big enough
str2 = _T("ok");
memcpy( &str2, &str, (_tcslen(str)+1)*sizeof(TCHAR));
#include "windows.h"
#include "TCHAR.H" // for _tcscpy_s
int main()
{
TCHAR * str = _T("Hello");
TCHAR * str2 = new TCHAR[23];
_tcscpy_s(str2, 23, _T("OK")); // store OK
_tcscpy_s(str2, 23, str); // Copy str
delete[] str2;
}
std::wstring str(L"Hello");
std::wstring str2(L"OK");
str2 = str; // for the copy.
str2.c_str() // to get a c style string