3

wcscpy_susing和 using之间有什么实际区别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 );

如果没有实际区别,为什么微软需要添加wcscpy_s到 Visual Studio,什么时候wcsncpy已经可用和一个标准功能?

从 Visual Studio 移植到 gcc 时可以替换wcscpy_sto吗?wcsncpy

4

4 回答 4

9

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

来自MSDN 文档wcscpy_s

成功执行后,目标字符串将始终为空终止。

根据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);

wcsncpy函数从 指向的数组复制不超过n宽字符(不复制空宽字符后的字符)到 指向s2的数组 s1

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

和脚注(#346):

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

请注意,strncpyandwcsncpy不是为使用以空字符结尾的字符串而设计的。它们是为使用空填充的固定宽度字符串而设计的。

于 2013-02-15T10:05:50.017 回答
5

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

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

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

于 2013-11-04T22:40:07.697 回答
1

wcscpy_s 更安全,它可以检测到您的错误并触发Invalid Parameter Handler Routine。为了在不导致崩溃的情况下处理此类错误,他们提供了_set_invalid_parameter_handler.

于 2014-12-31T11:35:58.853 回答
0

带有 _s 的函数是更安全的函数。通常,不包含尾随 _s 的函数将被 VS2012 标记为“已弃用”。您将收到警告。更多信息:MSDN有大量关于这方面的信息。

于 2013-02-15T10:01:47.283 回答