strncpy
, _strncpy_l
, wcsncpy
, _wcsncpy_l
, _mbsncpy
, _mbsncpy_l
Salin karakter dari satu string ke string lainnya. Versi yang lebih aman dari fungsi-fungsi ini tersedia; lihat strncpy_s
, , wcsncpy_s
_strncpy_s_l
, _wcsncpy_s_l
, , . _mbsncpy_s_l
_mbsncpy_s
Penting
_mbsncpy
dan _mbsncpy_l
tidak dapat digunakan dalam aplikasi yang dijalankan di Windows Runtime. Untuk informasi selengkapnya, lihat Fungsi CRT yang tidak didukung di aplikasi Platform Windows Universal.
Sintaks
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
Parameter
strDest
String tujuan.
strSource
String sumber.
count
Jumlah karakter yang akan disalin.
locale
Lokal untuk digunakan.
Nilai hasil
Menampilkan strDest
. Tidak ada nilai pengembalian yang dicadangkan untuk menunjukkan kesalahan.
Keterangan
Fungsi strncpy
menyalin karakter awal count
ke strSource
strDest
dan mengembalikan strDest
. Jika count
kurang dari atau sama dengan panjang strSource
, karakter null tidak ditambahkan secara otomatis ke string yang disalin. Jika count
lebih besar dari panjang strSource
, string tujuan diisi dengan karakter null hingga panjang count
. Perilaku strncpy
tidak terdefinisi jika string sumber dan tujuan tumpang tindih.
Penting
strncpy
tidak memeriksa ruang yang cukup di strDest
; ini menjadikannya potensi penyebab overruns buffer. Argumen count
membatasi jumlah karakter yang disalin; itu bukan batas ukuran strDest
. Lihat contoh berikut. Untuk informasi selengkapnya, lihat Menghindari overruns buffer.
Jika strDest
atau strSource
adalah NULL
penunjuk, atau jika count
kurang dari atau sama dengan nol, handler parameter yang tidak valid dipanggil, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, fungsi-fungsi ini mengembalikan -1 dan diatur errno
ke EINVAL
.
wcsncpy
dan _mbsncpy
adalah versi karakter lebar dan multibyte-character dari strncpy
. Argumen dan nilai pengembalian dan wcsncpy
_mbsncpy
bervariasi sesuai. Keenam fungsi ini berulah secara identik jika tidak.
Versi fungsi-fungsi ini dengan _l
akhiran identik kecuali bahwa mereka menggunakan lokal yang diteruskan alih-alih lokal saat ini untuk perilaku yang bergantung pada lokal mereka. Untuk informasi selengkapnya, lihat Lokal.
Di C++, fungsi-fungsi ini memiliki kelebihan beban templat yang memanggil rekan-rekan yang lebih baru dan aman dari fungsi-fungsi ini. Untuk informasi selengkapnya, lihat Mengamankan kelebihan beban templat.
Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.
Pemetaan rutin teks generik
TCHAR.H Rutin |
_UNICODE dan _MBCS tidak ditentukan |
_MBCS Didefinisikan |
_UNICODE Didefinisikan |
---|---|---|---|
_tcsncpy |
strncpy |
_mbsnbcpy |
wcsncpy |
_tcsncpy_l |
_strncpy_l |
_mbsnbcpy_l |
_wcsncpy_l |
Catatan
_strncpy_l
dan _wcsncpy_l
tidak memiliki ketergantungan lokal; mereka disediakan hanya untuk _tcsncpy_l
dan tidak dimaksudkan untuk dipanggil secara langsung.
Persyaratan
Rutin | Header yang diperlukan |
---|---|
strncpy |
<string.h> |
wcsncpy |
<string.h> atau <wchar.h> |
_mbsncpy , _mbsncpy_l |
<mbstring.h> |
Untuk informasi kompatibilitas platform lainnya, lihat Kompatibilitas.
Contoh
Contoh berikut menunjukkan penggunaan strncpy
dan bagaimana hal itu dapat disalahgunakan untuk menyebabkan bug program dan masalah keamanan. Pengkompilasi menghasilkan peringatan untuk setiap panggilan yang strncpy
mirip crt_strncpy_x86.c(15)
dengan : peringatan C4996: 'strncpy
': Fungsi atau variabel ini mungkin tidak aman. Pertimbangkan untuk menggunakan strncpy_s
sebagai gantinya. Untuk menonaktifkan penghentian, gunakan _CRT_SECURE_NO_WARNINGS
. Lihat bantuan online untuk detailnya.
// 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.
}
Hasil
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')
Tata letak variabel otomatis dan tingkat deteksi kesalahan dan perlindungan kode dapat bervariasi dengan pengaturan pengkompilasi yang diubah. Contoh ini mungkin memiliki hasil yang berbeda saat dibangun di lingkungan kompilasi lain atau dengan opsi kompilator lainnya.
Baca juga
Manipulasi string
Lokal
Interpretasi urutan karakter multibyte
_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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk