使用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 );
Run Code Online (Sandbox Code Playgroud)
如果没有实际差异,为什么Microsoft需要添加wcscpy_s到Visual Studio,什么时候wcsncpy已经可用并且标准功能?
是否确定替换wcscpy_s到wcsncpy从Visual Studio移植到gcc的时候?
这两个函数没有相同的行为.
成功执行后,目标字符串将始终以null结尾.
从wcsncpy(C11 7.29.4.2.2/1-3)的规范:
Run Code Online (Sandbox Code Playgroud)#include <wchar.h> wchar_t *wcsncpy(wchar_t * restrict s1, const wchar_t * restrict s2, size_t n);在
wcsncpy不超过功能拷贝n宽字符从阵列(那些遵循一个空宽字符不会被复制)指向s2到阵列指向s1.如果指向的数组
s2是一个比n宽字符短的宽字符串,则将空宽字符附加到指向的数组中的副本s1,直到n所有字符都被写入
和脚注(#346):
因此,如果
n指向的数组的第一个宽字符中没有空宽字符s2,则结果将不会以空值终止.
需要注意的是strncpy,并wcsncpy没有被设计为与null结尾的字符串使用.它们设计用于零填充,固定宽度的字符串.
另一个区别(花了我几个小时盯着代码,想知道正在发生什么),这是wcscpy_s函数默认情况下将在终止缓冲区时终止应用程序。
我希望它的行为类似于strncpy变体之一。事实并非如此!
您显然可以使用_set_invalid_parameter_handler函数更改此行为。