我想知道哪种方法正确?
_tcscpy(tchar_pointer, _tcslen(tchar_pointer), _T("Hello World"));
或
_tcscpy(tchar_pointer, _tcsclen(tchar_pointer), _T("Hello World"));
或
_tcscpy(tchar_pointer, ???, _T("Hello World"));
答案 0 :(得分:7)
假设您使用的是_tcscpy_s
而不是_tcscpy
,则第二个参数应该是数组的实际大小,而不是当前包含的字符串的长度。例如:
TCHAR dest[20];
_tcscpy_s(dest, _countof(dest), _T("Hello"));
您甚至可以使用不需要size参数的2参数版本:
_tcscpy_s(dest, _T("Hello"));
如果tchar_pointer
实际上是指针而不是数组(如其名称所暗示的那样),则在确定其实际容量时需要非常小心。需要更多的上下文来建议正确的方法,但是使用包含的字符串的长度来计算缓冲区的大小几乎肯定是错误的方法。
答案 1 :(得分:6)
tchar指针来自外部,我方不知道指针引用的缓冲区有多大
如果是这样,那么这些都不会做你想要的。
所有“安全”功能的工作方式是告诉他们目标缓冲区有多大。
你不知道吗?你不能使用这些功能。int buffer_size = _tcslen(xxx) * sizeof(TCHAR)
无效。所有这一切都将保证复制的字符串不会超过缓冲区中已有的字符串。如果缓冲区尚未初始化,则会失败;如果缓冲区以'\0'
开头,则不会复制任何内容;等等。
答案 2 :(得分:3)
bara的回答对您来说非常重要,因为正确答案与您列出的所有想法不同。但是bara并没有向你解释_tcslen和_tcsclen之间的区别,所以我会这样做。
在Unicode编译中,_tcslen和_tcsclen都将计算字符串当前值中的TCHAR数。每个TCHAR都是一个wchar_t。
在多字节编译中,_tcslen将计算字符串当前值中的TCHAR数。每个TCHAR都是一个字符。但_tcsclen将计算字符串当前值中的多字节字符数。每个多字节字符是一个或多个TCHAR,每个多字节字符是一个或多个字符。不同的多字节字符可以有不同的长度,具体取决于代码页和单个字符。
答案 3 :(得分:2)
如果tchar_pointer
是一个指针(而不是数组),你应该知道自己指向的缓冲区有多大。如果你不知道,你无法从原始指针中找到,strcpy_s
对那里没有帮助。