Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将TCHAR指针复制到TCHAR指针的最佳方法_C++ - Fatal编程技术网

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

C++ 将TCHAR指针复制到TCHAR指针的最佳方法,c++,C++,我不知道为什么这看起来比实际情况更复杂!我只是想用str的内容替换str2的内容,它们都是字符串。这似乎可行,但我不确定这是正确的方法…我使用的是Visual Studio 2008 编辑:我必须为str2使用new EDIT2:我按照Michael的建议尝试了这个,但我得到了访问冲突错误: 如果您想使用TCHAR(我不确定是否推荐),请在TCHAR.h中查找为所有strxxx函数提供TCHAR等价物的宏。例如,要复制基于TCHAR的字符串,可以使用_tcscpy 实际上,许多基本运行时库函数都

我不知道为什么这看起来比实际情况更复杂!我只是想用str的内容替换str2的内容,它们都是字符串。这似乎可行,但我不确定这是正确的方法…我使用的是Visual Studio 2008

编辑:我必须为str2使用new

EDIT2:我按照Michael的建议尝试了这个,但我得到了访问冲突错误:

如果您想使用TCHAR(我不确定是否推荐),请在TCHAR.h中查找为所有strxxx函数提供TCHAR等价物的宏。例如,要复制基于TCHAR的字符串,可以使用_tcscpy

实际上,许多基本运行时库函数都有TCHAR变量的宏,这些函数采用字符串或char参数,而不仅仅是strxxx函数集

因此,您的示例可以归结为:

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