使用wcscpy_s
和使用wcsncpy
有什么实际的区别吗?唯一的区别似乎是参数和返回值的顺序:
errno_t wcscpy_s(wchar_t *strDestination,
size_t numberOfElements,
const wchar_t *strSource);
wchar_t *wcsncpy(wchar_t *strDest,
const wchar_t *strSource,
size_t count );
如果没有实际的区别,为什么微软需要在visual studio中添加
wcscpy_s
,而wcsncpy
已经可用并且是一个标准函数?从visual studio移植到gcc时,是否可以将
wcscpy_s
替换为wcsncpy
? 最佳答案
这两个函数的行为不同。
从AA>
成功执行后,目标字符串将始终以空结尾。
根据wcscpy_s
(c11 7.29.4.2.2/1-3)的规范:
#include <wchar.h>
wchar_t *wcsncpy(wchar_t * restrict s1,
const wchar_t * restrict s2,
size_t n);
wcsncpy
函数复制不超过wcsncpy
宽字符(那些跟在空字符后面的字符不复制宽字符)从
n
指向的数组复制到s2
如果
s1
指向的数组是短于s2
宽字符的宽字符串,则将空宽字符附加到n
指向的数组中的副本,直到总共写入s1
宽字符以及脚注(346):
因此,如果
n
指向的数组的前n
个宽字符中没有空的宽字符,则结果不会以空结尾。注意
s2
和strncpy
不是为使用以空结尾的字符串而设计的。它们设计用于空填充的固定宽度字符串。