1. ホーム
  2. c

[解決済み] wcsncpyとwcscpy_sの違いは何ですか?

2022-03-01 04:05:53

質問

を使用するのとでは、実用上何か違いがあるのでしょうか? wcscpy_swcsncpy ? 違いは、パラメータと戻り値の順番だけのようです。

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 はすでに利用可能で、標準的な機能だったのですか?

を置き換えることは可能ですか? wcscpy_s から wcsncpy Visual Studioからgccに移植するとき?

どのように解決するのですか?

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

から の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 で指定した配列のコピーに null ワイド文字が追加されます。 s1 まで、または n 幅の広い文字がすべて書き込まれました

と脚注(#346)があります。

したがって、もし最初の n で指される配列のワイド文字。 s2 の場合、結果はヌル文字で終端されません。

なお strncpywcsncpy は、ヌル文字で終端する文字列と一緒に使うようには設計されていません。 これらは、ヌルパディングされた固定幅の文字列で使用するために設計されています。