我不知道为什么这似乎比它更复杂!我只想将str2
的内容替换为str
的内容,它们都是字符串。这似乎有效,但我不确定这是正确的做法......我正在使用Visual Studio 2008。
编辑:我必须将new
用于str2
TCHAR *str = _T("Hello");
TCHAR* str2;
str2 = new TCHAR[23]; // let us say this is big enough
str2 = _T("ok");
memcpy( &str2, &str, (_tcslen(str)+1)*sizeof(TCHAR));
EDIT2:我按照迈克尔的建议尝试了这个,但我得到了access violation error
:(
TCHAR *str = _T("Hello");
TCHAR* str2;
str2 = new TCHAR[23]; // let us say this is big enough
str2 = _T("ok");
_tcscpy( str2, str);
答案 0 :(得分:4)
如果您想使用TCHAR
(我不确定我是否推荐),请在tchar.h
中查找为您提供等效TCHAR
的宏所有strxxx()
函数。例如,要复制基于TCHAR
的字符串,您可以使用_tcscpy()
。
实际上,对于许多带有字符串或char参数的基本运行时库函数,TCHAR
变量都有宏,而不仅仅是strxxx()
函数集。
所以你的例子可以归结为:
TCHAR *str = _T("Hello");
TCHAR* str2 = new TCHAR[23]; // let us say this is big enough
_tcscpy( str2, str);
答案 1 :(得分:2)
TCHAR *str = _T("Hello");
行。
TCHAR* str2;
行。
str2 = new TCHAR[23]; // let us say this is big enough
好的,但必须与delete[]
配对。
str2 = _T("ok");
不行。覆盖指向new 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;
}
这与Michael Burr建议的几乎相同。唯一显着的区别是保留OK和_tcscpy_s
,如果我没记错的话,通过在溢出时终止程序将副本限制为23个字符。如果终止不是您的答案,wcsncpy_s将允许截断。不知道是否有_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根据编译期间设置的选项在字符类型之间进行透明切换,以便为具有或不具有宽字符支持的系统构建相同的源。 wstring严格来说很宽。 L前缀字符串严格宽。你可以用包裹所有字符串和流的宏做同样的事情,但它不会是微不足道的,而且eeewwwwww ....宏......