strncpy_s
, _strncpy_s_l
, wcsncpy_s
, , _wcsncpy_s_l
, _mbsncpy_s
, _mbsncpy_s_l
, _tcsnccpy_s
, _tcsnccpy_s_l
Bir dizenin karakterlerini başka bir dizeye kopyalar. , , , wcsncpy
, _wcsncpy_l
, _mbsncpy_l
_mbsncpy
, _strncpy_l
sürümlerininstrncpy
, CRT'deki Güvenlik özellikleri bölümünde açıklandığı gibi güvenlik geliştirmeleri vardır.
Önemli
_mbsncpy_s
ve _mbsncpy_s_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.
ve için _tcsnccpy_s
bkz. Genel metin yordamı eşlemeleri_tcsnccpy_s_l
.
Sözdizimi
errno_t strncpy_s(
char *strDest,
size_t numberOfElements,
const char *strSource,
size_t count
);
errno_t _strncpy_s_l(
char *strDest,
size_t numberOfElements,
const char *strSource,
size_t count,
_locale_t locale
);
errno_t wcsncpy_s(
wchar_t *strDest,
size_t numberOfElements,
const wchar_t *strSource,
size_t count
);
errno_t _wcsncpy_s_l(
wchar_t *strDest,
size_t numberOfElements,
const wchar_t *strSource,
size_t count,
_locale_t locale
);
errno_t _mbsncpy_s(
unsigned char *strDest,
size_t numberOfElements,
const unsigned char *strSource,
size_t count
);
errno_t _mbsncpy_s_l(
unsigned char *strDest,
size_t numberOfElements,
const unsigned char *strSource,
size_t count,
_locale_t locale
);
template <size_t size>
errno_t strncpy_s(
char (&strDest)[size],
const char *strSource,
size_t count
); // C++ only
template <size_t size>
errno_t _strncpy_s_l(
char (&strDest)[size],
const char *strSource,
size_t count,
_locale_t locale
); // C++ only
template <size_t size>
errno_t wcsncpy_s(
wchar_t (&strDest)[size],
const wchar_t *strSource,
size_t count
); // C++ only
template <size_t size>
errno_t _wcsncpy_s_l(
wchar_t (&strDest)[size],
const wchar_t *strSource,
size_t count,
_locale_t locale
); // C++ only
template <size_t size>
errno_t _mbsncpy_s(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count
); // C++ only
template <size_t size>
errno_t _mbsncpy_s_l(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count,
_locale_t locale
); // C++ only
Parametreler
strDest
Hedef dize.
numberOfElements
Hedef dizenin karakter cinsinden boyutu.
strSource
Kaynak dize.
count
Kopyalanacak karakter sayısı veya _TRUNCATE
.
locale
Kullanılacak yerel ayar.
Dönüş değeri
Başarılı olursa sıfır, STRUNCATE
kesme oluştuysa, aksi takdirde bir hata kodu.
Hata koşulları
strDest |
numberOfElements |
strSource |
Dönüş değeri | İçeriği strDest |
---|---|---|---|---|
NULL |
herhangi bir | herhangi bir | EINVAL |
değiştirilmedi |
herhangi bir | herhangi bir | NULL |
EINVAL |
strDest[0] 0 olarak ayarlayın |
herhangi bir | 0 | herhangi bir | EINVAL |
değiştirilmedi |
değil NULL |
çok küçük | herhangi bir | ERANGE |
strDest[0] 0 olarak ayarlayın |
Açıklamalar
Bu işlevler, öğesinin ilk D
karakterlerini strSource
öğesine kopyalamaya strDest
çalışır; burada D
daha küçük count
ve uzunluğudur strSource
. Bu D
karakterler içine strDest
sığacaksa (boyutu olarak numberOfElements
verilmiştir) ve yine de null sonlandırıcı için yer bırakırsa, bu karakterler kopyalanır ve bir sonlandırıcı null eklenir; aksi takdirde, strDest[0]
null karaktere ayarlanır ve Parametre doğrulamada açıklandığı gibi geçersiz parametre işleyicisi çağrılır.
Yukarıdaki paragrafta bir özel durum vardır. ise count
_TRUNCATE
, her zaman eklenen sonlandırıcı null için yer bırakılırken içine sığacak strDest
kadar kopyalanırstrSource
.
Örneğin,
char dst[5];
strncpy_s(dst, 5, "a long string", 5);
beş strncpy_s
karakteri 5 baytlık arabelleğe kopyaladığı anlamına gelir. Bu kopya null sonlandırıcı için boş alan bırakmaz, bu nedenle strncpy_s
dizeyi sıfırlar ve geçersiz parametre işleyicisini çağırır.
Kesme davranışı gerekiyorsa veya (size
- 1) kullanın_TRUNCATE
:
strncpy_s(dst, 5, "a long string", _TRUNCATE);
strncpy_s(dst, 5, "a long string", 4);
değerinden farklı strncpy
olarak, değerinden strSource
büyüksecount
, hedef dize uzunluğuna count
kadar null karakterlerle doldurulmaZ.
Kaynak ve hedef dizeler çakışıyorsa, öğesinin davranışı strncpy_s
tanımlanmamıştır.
veya strDest
strSource
ise NULL
veya numberOfElements
0 ise, geçersiz parametre işleyicisi çağrılır. Yürütmenin devam etmesi için izin verilirse, işlevi döndürür EINVAL
ve olarak EINVAL
ayarlanırerrno
.
wcsncpy_s
ve _mbsncpy_s
geniş karakterli ve çok baytlı sürümleridir strncpy_s
. bağımsız değişkenleri ve dönüş değeri wcsncpy_s
ve mbsncpy_s
değeri buna göre değişir. Bu altı işlev aynı şekilde davranır.
Çıkış değeri, yerel ayarın LC_CTYPE
kategori ayarının ayarından etkilenir. Daha fazla bilgi için bkz. setlocale
. Bu işlevlerin son eki olmayan _l
sürümleri, bu yerel ayara bağımlı davranış için geçerli yerel ayarı kullanır; son ekine _l
sahip sürümler, bunun yerine geçirilen yerel ayar parametresini kullanmaları dışında aynıdır. Daha fazla bilgi için bkz . Yerel Ayar.
C++'ta bu işlevlerin kullanılması şablon aşırı yüklemeleriyle basitleştirilir; aşırı yüklemeler arabellek uzunluğunu otomatik olarak çıkarabilir (boyut bağımsız değişkeni belirtme gereksinimini ortadan kaldırır) ve eski, güvenli olmayan işlevleri yeni ve güvenli karşılıklarıyla otomatik olarak değiştirebilir. Daha fazla bilgi için bkz . Güvenli şablon aşırı yüklemeleri.
Bu işlevlerin hata ayıklama kitaplığı sürümleri önce arabelleği 0xFE ile doldurur. Bu davranışı devre dışı bırakmak için kullanın _CrtSetDebugFillThreshold
.
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
Sütundaki tchar.h
işlev, derleme zamanında tanımlanan karakter kümesine bağlı olarak diğer sütunlardaki işlevle eşler.
tchar.h olağan |
_UNICODE ve _MBCS tanımlanmadı |
_MBCS tanımlanan |
_UNICODE tanımlanan |
---|---|---|---|
_tcsncpy_s |
strncpy_s |
_mbsnbcpy_s |
wcsncpy_s |
_tcsncpy_s_l |
_strncpy_s_l |
_mbsnbcpy_s_l |
_wcsncpy_s_l |
_tcsnccpy_s |
strncpy_s |
_mbsncpy_s |
_wcsncpy_s |
_tcsnccpy_s_l |
_strncpy_s_l |
_mbsncpy_s_l |
_wcsncpy_s_l |
Not
_strncpy_s_l
ve _wcsncpy_s_l
_mbsncpy_s_l
hiçbir yerel ayar bağımlılığına sahip değildir. Bunlar yalnızca için _tcsncpy_s_l
sağlanır ve doğrudan çağrılmak üzere tasarlanmamıştır.
Gereksinimler
Yordam | Gerekli başlık |
---|---|
strncpy_s , _strncpy_s_l |
<string.h> |
wcsncpy_s , _wcsncpy_s_l |
<string.h> veya <wchar.h> |
_mbsncpy_s , _mbsncpy_s_l |
<mbstring.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek: Karakterleri arabelleğe kopyalama
// crt_strncpy_s_1.cpp
// compile with: /MTd
// these #defines enable secure template overloads
// (see last part of Examples() below)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h> // For _CrtSetReportMode
#include <errno.h>
// This example uses a 10-byte destination buffer.
errno_t strncpy_s_tester( const char * src,
int count )
{
char dest[10];
printf( "\n" );
if ( count == _TRUNCATE )
printf( "Copying '%s' to %d-byte buffer dest with truncation semantics\n",
src, _countof(dest) );
else
printf( "Copying %d chars of '%s' to %d-byte buffer dest\n",
count, src, _countof(dest) );
errno_t err = strncpy_s( dest, _countof(dest), src, count );
printf( " new contents of dest: '%s'\n", dest );
return err;
}
void Examples()
{
strncpy_s_tester( "howdy", 4 );
strncpy_s_tester( "howdy", 5 );
strncpy_s_tester( "howdy", 6 );
printf( "\nDestination buffer too small:\n" );
strncpy_s_tester( "Hi there!!", 10 );
printf( "\nTruncation examples:\n" );
errno_t err = strncpy_s_tester( "How do you do?", _TRUNCATE );
printf( " truncation %s occur\n", err == STRUNCATE ? "did"
: "did not" );
err = strncpy_s_tester( "Howdy.", _TRUNCATE );
printf( " truncation %s occur\n", err == STRUNCATE ? "did"
: "did not" );
printf( "\nSecure template overload example:\n" );
char dest[10];
strncpy( dest, "very very very long", 15 );
// With secure template overloads enabled (see #defines at
// top of file), the preceding line is replaced by
// strncpy_s( dest, _countof(dest), "very very very long", 15 );
// Instead of causing a buffer overrun, strncpy_s invokes
// the invalid parameter handler.
// If secure template overloads were disabled, strncpy would
// copy 15 characters and overrun the dest buffer.
printf( " new contents of dest: '%s'\n", dest );
}
void myInvalidParameterHandler(
const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
wprintf(L"Invalid parameter handler invoked: %s\n", expression);
}
int main( void )
{
_invalid_parameter_handler oldHandler, newHandler;
newHandler = myInvalidParameterHandler;
oldHandler = _set_invalid_parameter_handler(newHandler);
// Disable the message box for assertions.
_CrtSetReportMode(_CRT_ASSERT, 0);
Examples();
}
Copying 4 chars of 'howdy' to 10-byte buffer dest
new contents of dest: 'howd'
Copying 5 chars of 'howdy' to 10-byte buffer dest
new contents of dest: 'howdy'
Copying 6 chars of 'howdy' to 10-byte buffer dest
new contents of dest: 'howdy'
Destination buffer too small:
Copying 10 chars of 'Hi there!!' to 10-byte buffer dest
Invalid parameter handler invoked: (L"Buffer is too small" && 0)
new contents of dest: ''
Truncation examples:
Copying 'How do you do?' to 10-byte buffer dest with truncation semantics
new contents of dest: 'How do yo'
truncation did occur
Copying 'Howdy.' to 10-byte buffer dest with truncation semantics
new contents of dest: 'Howdy.'
truncation did not occur
Secure template overload example:
Invalid parameter handler invoked: (L"Buffer is too small" && 0)
new contents of dest: ''
Örnek: strncpy
ve strncpy_s
// crt_strncpy_s_2.c
// contrasts strncpy and strncpy_s
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
char a[20] = "test";
char s[20];
// simple strncpy usage:
strcpy_s( s, 20, "dogs like cats" );
printf( "Original string:\n '%s'\n", s );
// Here we can't use strncpy_s since we don't
// want null termination
strncpy( s, "mice", 4 );
printf( "After strncpy (no null-termination):\n '%s'\n", s );
strncpy( s+5, "love", 4 );
printf( "After strncpy into middle of string:\n '%s'\n", s );
// If we use strncpy_s, the string is terminated
strncpy_s( s, _countof(s), "mice", 4 );
printf( "After strncpy_s (with null-termination):\n '%s'\n", s );
}
Original string:
'dogs like cats'
After strncpy (no null-termination):
'mice like cats'
After strncpy into middle of string:
'mice love cats'
After strncpy_s (with null-termination):
'mice'
Ayrıca bkz.
Dize işleme
Yerel ayar
Çok baytlı karakter dizilerinin yorumlanması
_mbsnbcpy
, _mbsnbcpy_l
strcat_s
, wcscat_s
, _mbscat_s
strcmp
, wcscmp
, _mbscmp
strcpy_s
, wcscpy_s
, _mbscpy_s
strncat_s
, _strncat_s_l
, wcsncat_s
, , _wcsncat_s_l
, _mbsncat_s
, _mbsncat_s_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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin