strncpy
、 _strncpy_l
、 wcsncpy
、 _wcsncpy_l
、 _mbsncpy
、 _mbsncpy_l
文字列の文字を別の文字列にコピーします。 これらの関数のセキュリティを強化したバージョンを使用できます。「strncpy_s
、_strncpy_s_l
、wcsncpy_s
、_wcsncpy_s_l
、_mbsncpy_s
、_mbsncpy_s_l
」を参照してください。
重要
_mbsncpy
および _mbsncpy_l
は、Windows ランタイムで実行するアプリケーションでは使用できません。 詳細については、「ユニバーサル Windows プラットフォーム アプリでサポートされていない CRT 関数」を参照してください。
構文
char *strncpy(
char *strDest,
const char *strSource,
size_t count
);
char *_strncpy_l(
char *strDest,
const char *strSource,
size_t count,
_locale_t locale
);
wchar_t *wcsncpy(
wchar_t *strDest,
const wchar_t *strSource,
size_t count
);
wchar_t *_wcsncpy_l(
wchar_t *strDest,
const wchar_t *strSource,
size_t count,
_locale_t locale
);
unsigned char *_mbsncpy(
unsigned char *strDest,
const unsigned char *strSource,
size_t count
);
unsigned char *_mbsncpy_l(
unsigned char *strDest,
const unsigned char *strSource,
size_t count,
_locale_t locale
);
template <size_t size>
char *strncpy(
char (&strDest)[size],
const char *strSource,
size_t count
); // C++ only
template <size_t size>
char *_strncpy_l(
char (&strDest)[size],
const char *strSource,
size_t count,
_locale_t locale
); // C++ only
template <size_t size>
wchar_t *wcsncpy(
wchar_t (&strDest)[size],
const wchar_t *strSource,
size_t count
); // C++ only
template <size_t size>
wchar_t *_wcsncpy_l(
wchar_t (&strDest)[size],
const wchar_t *strSource,
size_t count,
_locale_t locale
); // C++ only
template <size_t size>
unsigned char *_mbsncpy(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count
); // C++ only
template <size_t size>
unsigned char *_mbsncpy_l(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count,
_locale_t locale
); // C++ only
パラメーター
strDest
対象文字列。
strSource
ソース文字列。
count
コピーする文字数。
locale
使用するロケール。
戻り値
strDest
を返します。 エラーを示す戻り値は予約されていません。
解説
strncpy
関数は、strSource
の先頭から count
文字を strDest
にコピーし、strDest
を返します。 count
がstrSource
の長さ以下の場合、コピーした文字列に null 文字が自動的に追加されることはありません。 count
が strSource
の長さより大きい場合、コピー先の文字列が長さ count
になるまで null 文字が埋め込まれます。 コピー元とコピー先の文字列が重なり合っている場合の strncpy
関数の動作は未定義です。
重要
strncpy
は、strDest
に十分な領域があるかどうかを確認しません。これがバッファー オーバーランの原因になることがあります。 count
引数が、コピーする文字数を限定することに注意してください。strDest
のサイズによってコピーする文字数が限定されることはありません。 次の例を参照してください。 詳細については、「バッファー オーバーランの回避」を参照してください。
strDest
またはstrSource
がNULL
ポインターである場合、またはcount
が 0 以下の場合は、「パラメーター検証で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、これらの関数は -1 を返し、errno
を EINVAL
に設定します。
wcsncpy
関数と _mbsncpy
関数は、strncpy
関数のワイド文字バージョンとマルチバイト文字バージョンです。 wcsncpy
関数と _mbsncpy
関数は、それぞれ引数と戻り値が異なります。 それ以外では、これらの関数の動作は同じです。
これらの関数のうち _l
サフィックスが付けられたバージョンは同じですが、ロケールに依存する動作に現在のロケールではなく渡されたロケールを使用するという点で異なります。 詳細については、「 Locale」を参照してください。
C++ では、これらの関数にテンプレートのオーバーロードがあります。このオーバーロードは、これらの関数に対応するセキュリティで保護された新しい関数を呼び出します。 詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
汎用テキスト ルーチンのマップ
TCHAR.H ルーチン |
_UNICODE と _MBCS が定義されていない |
_MBCS が定義されている |
_UNICODE が定義されている |
---|---|---|---|
_tcsncpy |
strncpy |
_mbsnbcpy |
wcsncpy |
_tcsncpy_l |
_strncpy_l |
_mbsnbcpy_l |
_wcsncpy_l |
Note
_strncpy_l
および _wcsncpy_l
はロケールに依存しません。これらは _tcsncpy_l
のために用意されている関数で、直接呼び出すためのものではありません。
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
strncpy |
<string.h> |
wcsncpy |
<string.h> または <wchar.h> |
_mbsncpy , _mbsncpy_l |
<mbstring.h> |
プラットフォームの互換性情報の詳細については、「 Compatibility」を参照してください。
例
次の例では、strncpy
の使用方法を示します。また、この関数の誤用が、どのようにプログラムのバグやセキュリティ上の問題の原因になるかを示します。 コンパイラによって、crt_strncpy_x86.c(15)
と同様に strncpy
への呼び出しごとに警告が生成されます: 警告 C4996: 'strncpy
': この関数または変数は安全でない可能性があります。代わりに strncpy_s
の使用を検討してください。使用されなくなったことの警告を無効にするには、_CRT_SECURE_NO_WARNINGS
を使用します。詳しくは、オンライン ヘルプをご覧ください。
// crt_strncpy_x86.c
// Use this command in an x86 developer command prompt to compile:
// cl /TC /W3 crt_strncpy_x86.c
#include <stdio.h>
#include <string.h>
int main() {
char t[20];
char s[20];
char *p = 0, *q = 0;
strcpy_s(s, sizeof(s), "AA BB CC");
// Note: strncpy is deprecated; consider using strncpy_s instead
strncpy(s, "aa", 2); // "aa BB CC" C4996
strncpy(s + 3, "bb", 2); // "aa bb CC" C4996
strncpy(s, "ZZ", 3); // "ZZ", C4996
// count greater than strSource, null added
printf("%s\n", s);
strcpy_s(s, sizeof(s), "AA BB CC");
p = strstr(s, "BB");
q = strstr(s, "CC");
strncpy(s, "aa", p - s - 1); // "aa BB CC" C4996
strncpy(p, "bb", q - p - 1); // "aa bb CC" C4996
strncpy(q, "cc", q - s); // "aa bb cc" C4996
strncpy(q, "dd", strlen(q)); // "aa bb dd" C4996
printf("%s\n", s);
// some problems with strncpy
strcpy_s(s, sizeof(s), "test");
strncpy(t, "this is a very long string", 20 ); // C4996
// Danger: at this point, t has no terminating null,
// so the printf continues until it runs into one.
// In this case, it will print "this is a very long test"
printf("%s\n", t);
strcpy_s(t, sizeof(t), "dogs like cats");
printf("%s\n", t);
strncpy(t + 10, "to chase cars.", 14); // C4996
printf("%s\n", t);
// strncpy has caused a buffer overrun and corrupted string s
printf("Buffer overrun: s = '%s' (should be 'test')\n", s);
// Since the stack grows from higher to lower addresses, buffer
// overruns can corrupt function return addresses on the stack,
// which can be exploited to run arbitrary code.
}
出力
ZZ
aa bb dd
this is a very long test
dogs like cats
dogs like to chase cars.
Buffer overrun: s = 'ars.' (should be 'test')
自動変数のレイアウトや、エラー検出とコード保護のレベルは、コンパイラの設定を変更すると変わることがあります。 この例は、他のコンパイル環境で、または他のコンパイラ オプションを指定してビルドすると、出力の結果が異なることがあります。
関連項目
文字列操作
ロケール
マルチバイト文字のシーケンスの解釈
_mbsnbcpy
, _mbsnbcpy_l
strcat
、 wcscat
、 _mbscat
strcmp
、 wcscmp
、 _mbscmp
strcpy
、 wcscpy
、 _mbscpy
strncat
、 _strncat_l
、 wcsncat
、 _wcsncat_l
、 _mbsncat
、 _mbsncat_l
strncmp
、 wcsncmp
、 _mbsncmp
、 _mbsncmp_l
_strnicmp
、 _wcsnicmp
、 _mbsnicmp
、 _strnicmp_l
、 _wcsnicmp_l
、 _mbsnicmp_l
strrchr
、 wcsrchr
、 _mbsrchr
、 _mbsrchr_l
_strset
、 _strset_l
、 _wcsset
、 _wcsset_l
、 _mbsset
、 _mbsset_l
strspn
、 wcsspn
、 _mbsspn
、 _mbsspn_l
strncpy_s
、 _strncpy_s_l
、 wcsncpy_s
、 _wcsncpy_s_l
、 _mbsncpy_s
、 _mbsncpy_s_l
strcpy_s
、 wcscpy_s
、 _mbscpy_s