Aracılığıyla paylaş


strncpy, _strncpy_l, wcsncpy, , _wcsncpy_l, _mbsncpy, _mbsncpy_l

Bir dizenin karakterlerini başka bir dizeye kopyalayın. Bu işlevlerin daha güvenli sürümleri mevcuttur; bkz. strncpy_s, _strncpy_s_l, wcsncpy_s_wcsncpy_s_l, , _mbsncpy_s, _mbsncpy_s_l.

Önemli

_mbsncpyve _mbsncpy_l Windows Çalışma Zamanı yürütülen uygulamalarda kullanılamaz. Daha fazla bilgi için bkz. Evrensel Windows Platformu uygulamalarında desteklenmeyen CRT işlevleri.

Sözdizimi

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

Parametreler

strDest
Hedef dize.

strSource
Kaynak dize.

count
Kopyalanacak karakter sayısı.

locale
Kullanılacak yerel ayar.

Dönüş değeri

strDest döndürür. Hata belirtmek için hiçbir dönüş değeri ayrılmaz.

Açıklamalar

İşlev, öğesinin ilk count karakterlerini strSource öğesine strDest kopyalar ve döndürürstrDest.strncpy değerinden strSourceküçük veya uzunluğuna eşitsecount, kopyalanan dizeye otomatik olarak bir null karakter eklenmez. değerinden strSourcebüyüksecount, hedef dize uzunluğuna countkadar null karakterlerle doldurulur. Kaynak ve hedef dizeler çakışıyorsa, öğesinin davranışı strncpy tanımlanmamıştır.

Önemli

strncpy içinde strDestyeterli alan olup olmadığını denetlemez; bu, arabellek taşmalarının olası bir nedeni olmasını sağlar. count bağımsız değişkeni kopyalanan karakter sayısını sınırlar; boyutu strDestiçin bir sınır değildir. Aşağıdaki örneğe bakın. Daha fazla bilgi için bkz . Arabellek taşmalarından kaçınma.

veya strSource bir işaretçiyse strDest veya sıfırdan küçükse veya sıfıra eşitsecount, parametre doğrulamasında açıklandığı gibi geçersiz parametre işleyicisi NULL çağrılır. Yürütmenin devam etmesi için izin verilirse, bu işlevler -1 döndürür ve olarak EINVALayarlanırerrno.

wcsncpy ve _mbsncpy geniş karakterli ve çok baytlı sürümleridir strncpy. bağımsız değişkenleri ve dönüş değeri wcsncpy ve _mbsncpy buna göre değişir. Bu altı işlev aynı şekilde davranır.

Bu işlevlerin sonekli _l sürümleri aynıdır, ancak yerel ayara bağımlı davranışları için geçerli yerel ayar yerine geçirilen yerel ayarı kullanırlar. Daha fazla bilgi için bkz . Yerel Ayar.

C++ dilinde, bu işlevlerin daha yeni ve güvenli karşılıklarını çağıran şablon aşırı yüklemeleri vardır. Daha fazla bilgi için bkz . Güvenli şablon aşırı yüklemeleri.

Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bu davranışı değiştirmek için bkz. CRT'de Genel durum.

Genel metin yordamı eşlemeleri

TCHAR.H olağan _UNICODE ve _MBCS tanımlanmadı _MBCS tanımlanan _UNICODE tanımlanan
_tcsncpy strncpy _mbsnbcpy wcsncpy
_tcsncpy_l _strncpy_l _mbsnbcpy_l _wcsncpy_l

Not

_strncpy_l ve _wcsncpy_l hiçbir yerel ayar bağımlılığı yoktur; bunlar yalnızca için _tcsncpy_l sağlanır ve doğrudan çağrılmak üzere tasarlanmamıştır.

Gereksinimler

Yordam Gerekli başlık
strncpy <string.h>
wcsncpy <string.h> veya <wchar.h>
_mbsncpy, _mbsncpy_l <mbstring.h>

Daha fazla platform uyumluluğu bilgisi için bkz . Uyumluluk.

Örnek

Aşağıdaki örnekte, program hatalarına strncpy ve güvenlik sorunlarına neden olmak için kullanımı ve nasıl kötüye kullanılıp kullanılamayabileceği gösterilmektedir. Derleyici her çağrı strncpy için şuna benzer crt_strncpy_x86.c(15) bir uyarı oluşturur: uyarı C4996: 'strncpy': Bu işlev veya değişken güvenli olmayabilir. Bunun yerine kullanmayı strncpy_s göz önünde bulundurun. Kullanımdan kaldırmayı devre dışı bırakmak için kullanın _CRT_SECURE_NO_WARNINGS. Ayrıntılar için çevrimiçi yardıma bakın.

// 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.
}

Çıktı

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

Otomatik değişkenlerin düzeni ve hata algılama ve kod koruması düzeyi, değiştirilen derleyici ayarlarına göre farklılık gösterebilir. Bu örnek, diğer derleme ortamlarında veya diğer derleyici seçeneklerinde yerleşik olarak kullanıldığında farklı sonuçlara sahip olabilir.

Ayrıca bkz.

Dize işleme
Yerel ayar
Çok baytlı karakter dizilerinin yorumlanması
_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