Aracılığıyla paylaş


strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

Bir dizenin karakter diğerine kopyalayın. Bu işlevlerin daha güvenli sürümlerinde kullanılabilir; see strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l.

Önemli

_mbsncpyve _mbsncpy_l yürütün uygulamalarda kullanılamaz Windows Çalışma Zamanı.Daha fazla bilgi için bkz: /zw ile desteklenmeyen crt işlevlerinin.

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 dizesi.

  • count
    Kopyalanacak karakter sayısı.

  • locale
    Kullanılacak yerel ayarı.

Dönüş Değeri

Bir strDest döndürür. Hiçbir değer döndürmeyen bir hatayı göstermek için ayrılmıştır.

Notlar

strncpy İşlevi kopyalar ilk count karakter strSource için strDest ve strDest. count Uzunluğu, küçük veya eşit olan strSource, boş karakter dizesi olarak kopyalanmış otomatik olarak eklenmez. count Uzunluğundan daha büyük strSource, hedef dize uzunluğu en fazla boş karakter ile azsa count. Davranışını strncpy kaynak ve hedef dizeleri üst üste gelirse tanımsızdır.

Güvenlik NotuGüvenlik Notu

strncpyyeterli alana denetlemez strDest; Bu, olası bir nedeni Arabellek taşmaları kolaylaştırır.count Bağımsız değişkeni kopyalanır; karakter sayısını sınırlar bir boyutu sınırı değil strDest.Aşağıdaki örneklere bakın.Daha fazla bilgi için bkz: Kaçınma arabelleğin taşmasına neden.

strDest Veya strSource olan bir NULL , işaretçi veya count küçük veya eşit olan sıfır olarak geçersiz parametre işleyicisi, açıklandığı gibi çağrılır Parametre doğrulama. Yürütülmesine devam etmek için izin verilirse, bu işlevler -1 döndürür ve errno içinEINVAL

wcsncpyve _mbsncpy geniş karakter ve çok baytlı karakter sürümleri strncpy. Bağımsız değişkenleri ve dönüş değeri wcsncpy ve _mbsncpy buna göre değişir. Altı bu işlevler aynı şekilde aksi davranır.

Bu işlevleri sürümlerini _l soneki geçerli yerel ayarı için yerel ayara bağımlı davranışlarını geçirilen yerel kullandıkları dışında aynı. Daha fazla bilgi için bkz. Yerel ayar.

Bu işlevleri C++'da, bu işlevlerin daha yeni ve güvenli karşılıkları çağırmak şablon aşırı yükleme vardır. Daha fazla bilgi için bkz. Güvenli şablon aşırı yükleme.

Genel metin eşlemeleri yordamına girildi

TCHAR.H yordamına girildi

_UNICODE & _mbcs tanımlanmamış

Tanımlanan _mbcs

Tanımlanan _UNICODE

_tcsncpy

strncpy

_mbsnbcpy

wcsncpy

_tcsncpy_l

_strncpy_l

_mbsnbcpy_l

_wcsncpy_l

Not

_strncpy_lve _wcsncpy_l sahip hiçbir yerel otomatikleştirmekle; yalnızca için sağlanan _tcsncpy_l ve doğrudan adlı bir ilgisi yoktur.

Gereksinimler

Yordamı

Gerekli başlık

strncpy

<string.h>

wcsncpy

<string.h> veya <wchar.h>

_mbsncpy, _mbsncpy_l

<mbstring.h>

Platform ek uyumluluk bilgileri için bkz: Uyumluluk.

Örnek

Aşağıdaki örnek kullanımını gösterir strncpy ve nasıl bu program hataları ve güvenlik sorunlarına neden kötüye kullanılabilir. Derleyici her çağrı için bir uyarı oluşturur strncpy benzercrt_strncpy_x86.c(15) : warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

// 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ı

     

Değiştirilen derleyici ayarları ile otomatik değişkenlerinin düzenini ve hata algılama ve kod koruma düzeyini değişebilir. Bu örnek, derleme diğer ortamlarda veya diğer derleyici seçenekleri ile oluşturulduğunda, farklı sonuçlar olabilir.

.NET Framework Eşdeğeri

System::string::Copy

Ayrıca bkz.

Başvuru

Dize işlemleri (crt)

Yerel ayar

Yorumunu çok baytlı karakter dizileri

_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