将TCHAR指针复制到TCHAR指针的最佳方法

时间:2015-09-02 20:31:04

标签: c++

我不知道为什么这似乎比它更复杂!我只想将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);

2 个答案:

答案 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 ....宏......