wcsncpy和wcscpy_s有什么区别?

sas*_*alm 3 c visual-c++

使用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_swcsncpy从Visual Studio移植到gcc的时候?

Jam*_*lis 9

这两个函数没有相同的行为.

MSDN文档wcscpy_s:

成功执行后,目标字符串将始终以null结尾.

wcsncpy(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);
Run Code Online (Sandbox Code Playgroud)

wcsncpy不超过功能拷贝n宽字符从阵列(那些遵循一个空宽字符不会被复制)指向s2到阵列指向 s1.

如果指向的数组s2是一个比n宽字符短的宽字符串,则将空宽字符附加到指向的数组中的副本s1,直到n所有字符都被写入

和脚注(#346):

因此,如果n指向的数组的第一个宽字符中没有空宽字符s2,则结果将不会以空值终止.

需要注意的是strncpy,并wcsncpy没有被设计为与null结尾的字符串使用.它们设计用于零填充,固定宽度的字符串.


Wal*_*alt 5

另一个区别(花了我几个小时盯着代码,想知道正在发生什么),这是wcscpy_s函数默认情况下将在终止缓冲区时终止应用程序。

我希望它的行为类似于strncpy变体之一。事实并非如此!

您显然可以使用_set_invalid_parameter_handler函数更改此行为。