使用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个宽字符中没有空的宽字符,则结果不会以空结尾。
注意s2strncpy不是为使用以空结尾的字符串而设计的。它们设计用于空填充的固定宽度字符串。

09-12 10:23