3

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

また、実質的な違いがない場合、Microsoft はなぜwcscpy_sVisual Studio に機能を追加する必要wcsncpyがあったのですか?

Visual Studio から gcc に移植wcscpy_sする際に に置き換えてもよろしいですか?wcsncpy

4

4 に答える 4

9

これら 2 つの関数の動作は同じではありません。

の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);

このwcsncpy関数はn、 が指す配列から が指す配列に、最大ワイド文字 (null ワイド文字に続くものはコピーされません) をコピーs2s1ます。

が指す配列s2がワイド文字よりも短いワイド文字列の場合、すべてのワイド文字が書き込まれるまで、nが指す配列のコピーに null ワイド文字が追加されます。s1n

および脚注 (#346):

したがって、 がn指す配列の最初のワイド文字にヌル ワイド文字がない場合s2、結果はヌル終了しません。

strncpywcsncpyは、ヌル終了文字列で使用するように設計されていないことに注意してください。これらは、ヌルが埋め込まれた固定幅の文字列で使用するように設計されています。

于 2013-02-15T10:05:50.017 に答える
0

_s が追加された関数は、より安全な関数です。通常、末尾の _s を結合しない関数は、たとえば VS2012 によって「非推奨」とマークされます。警告が表示されます。追加情報: MSDNには、これに関する多くの情報があります。

于 2013-02-15T10:01:47.283 に答える