Bagikan melalui


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 strSourcestrDest 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