strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l
Acrescentar caracteres em uma cadeia de caracteres.Essas são versões de strncat, _strncat_l, wcsncat, wcsncat_l, _mbsncat _mbsncat_l com aprimoramentos de segurança conforme descrito em Recursos de segurança no CRT.
Importante |
---|
_mbsncat_s e _mbsncat_s_l não podem ser usados em aplicativos executados em Tempo de Execução do Windows.Para obter mais informações, consulte Funções de CRT não suportadas com /ZW. |
errno_t strncat_s( char *strDest, size_t numberOfElements, const char *strSource, size_t count ); errno_t _strncat_s_l( char *strDest, size_t numberOfElements, const char *strSource, size_t count, _locale_t locale ); errno_t wcsncat_s( wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count ); errno_t _wcsncat_s_l( wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count, _locale_t locale ); errno_t _mbsncat_s( unsigned char *strDest, size_t numberOfElements, const unsigned char *strSource, size_t count ); errno_t _mbsncat_s_l( unsigned char *strDest, size_t numberOfElements, const unsigned char *strSource, size_t count, _locale_t locale ); template <size_t size> errno_t strncat_s( char (&strDest)[size], const char *strSource, size_t count ); // C++ only template <size_t size> errno_t _strncat_s_l( char (&strDest)[size], const char *strSource, size_t count, _locale_t locale ); // C++ only template <size_t size> errno_t wcsncat_s( wchar_t (&strDest)[size], const wchar_t *strSource, size_t count ); // C++ only template <size_t size> errno_t _wcsncat_s_l( wchar_t (&strDest)[size], const wchar_t *strSource, size_t count, _locale_t locale ); // C++ only template <size_t size> errno_t _mbsncat_s( unsigned char (&strDest)[size], const unsigned char *strSource, size_t count ); // C++ only template <size_t size> errno_t _mbsncat_s_l( unsigned char (&strDest)[size], const unsigned char *strSource, size_t count, _locale_t locale ); // C++ only
Parâmetros
[out] strDest
Cadeia de caracteres NULL- finalizada de destino.[in]numberOfElements
Tamanho do buffer de destino.[in]strSource
Cadeia de caracteres NULL- finalizada de origem.[in]count
Número de caracteres para acrescentar, ou _TRUNCATE.[in] locale
A localidade usar.
Valor de retorno
Retorna 0 se com êxito, um código de erro em caso de falha.
Condições de erro
strDestination |
numberOfElements |
strSource |
Valor de Retorno |
Conteúdo de strDestination |
---|---|---|---|---|
NULL ou unterminated |
alguns |
alguns |
EINVAL |
não modificado |
alguns |
alguns |
NULL |
EINVAL |
não modificado |
alguns |
0, ou muito pequeno |
alguns |
ERANGE |
não modificado |
Comentários
Essas funções tenta acrescentar os primeiros caracteres de D de strSource ao final de strDest, onde os D é menor que count e o comprimento de strSource.Se anexar os caracteres de D caberá dentro de strDest (cujo tamanho é dado como numberOfElements) e para sair ainda de espaço para zero, um terminador então os caracteres são acrescentados, começando no original terminando o zero de strDest, e um novo zero de terminação é acrescentado; caso contrário, strDest[] 0 é definido como o caractere nulo e o manipulador inválido do parâmetro é chamado, como descrito em Validação de parâmetro.
Há uma exceção ao parágrafo anterior.Se count é _TRUNCATE em tão grande parte de strSource quanto caberá será acrescentado a strDest enquanto ainda deixar espaço acrescentar um zero de terminação.
Por exemplo,
char dst[5];
strncpy_s(dst, _countof(dst), "12", 2);
strncat_s(dst, _countof(dst), "34567", 3);
significa que nós estamos solicitando strncat_s para acrescentar long três caracteres em dois caracteres em caracteres de um buffer cinco; isso não deixaria nenhum espaço para o terminador portanto, os zeros nulos de strncat_s para fora a cadeia de caracteres e chama o manipulador inválido do parâmetro.
Se o comportamento de truncamento é necessário, use _TRUNCATE ou ajuste o parâmetro de size em conformidade:
strncat_s(dst, _countof(dst), "34567", _TRUNCATE);
ou
strncat_s(dst, _countof(dst), "34567", _countof(dst)-strlen(dst)-1);
Em todos os casos, a cadeia de caracteres resultante é finalizada com um caractere nulo.Se copiar ocorre entre as cadeias de caracteres que sobrepostos, o comportamento é indefinido.
Se strSource ou strDest são NULL, ou são numberOfElements for zero, o manipulador inválido do parâmetro é invocado, como descrito em Validação de parâmetro .Se a execução é permitida continuar, a função retorna EINVAL sem alterar seus parâmetros.
wcsncat_s e _mbsncat_s são versões de largo- caractere e o caractere multibyte- de strncat_s.Argumentos de cadeia de caracteres e o valor de retorno de wcsncat_s são cadeias de caracteres de largo- caractere; essas de _mbsncat_s são cadeias de caracteres de multibyte- caractere.Essas três funções se comportam de forma idêntica.
O valor de saída é afetado pela configuração da categoria de LC_CTYPE de localidade; consulte setlocale para mais informações.As versões dessas funções sem o sufixo de _l usam a localidade atual para este comportamento de são dependentes; as versões com o sufixo de _l são idênticas exceto que usam o parâmetro de localidade passado em vez disso.Para obter mais informações, consulte Localidade.
Em C++, usar essas funções é simplificada por sobrecargas de modelo; as sobrecargas podem interpretar o tamanho do buffer (automaticamente que elimina a necessidade de especificar um argumento de tamanho) e podem automaticamente substituir mais antigos, não funções de segurança mais recentes, com suas contrapartes seguros.Para obter mais informações, consulte Proteger Overloads de modelo.
As versões de depuração dessas funções preenchem primeiro o buffer com 0xFD.Para desativar esse comportamento, use _CrtSetDebugFillThreshold.
Mapeamentos da rotina de Genérico- texto
Rotina de TCHAR.H |
_UNICODE & _MBCS não definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tcsncat_s |
strncat_s |
_mbsnbcat_s |
wcsncat_s |
_tcsncat_s_l |
_strncat_s_l |
_mbsnbcat_s_l |
_wcsncat_s_l |
_strncat_s_l e _wcsncat_s_l não dependerem de localidade; são fornecidos apenas para _tcsncat_s_l.
Requisitos
Rotina |
Cabeçalho necessário |
---|---|
strncat_s |
<string.h> |
wcsncat_s |
<string.h> ou <wchar.h> |
_mbsncat_s, _mbsncat_s_l |
<mbstring.h> |
Para informações extras de compatibilidade Compatibilidade na introdução, consulte.
Exemplo
// crt_strncat_s.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 strncat_s_tester( const char * initialDest,
const char * src,
int count )
{
char dest[10];
strcpy_s( dest, _countof(dest), initialDest );
printf_s( "\n" );
if ( count == _TRUNCATE )
printf_s( "Appending '%s' to %d-byte buffer dest with truncation semantics\n",
src, _countof(dest) );
else
printf_s( "Appending %d chars of '%s' to %d-byte buffer dest\n",
count, src, _countof(dest) );
printf_s( " old contents of dest: '%s'\n", dest );
errno_t err = strncat_s( dest, _countof(dest), src, count );
printf_s( " new contents of dest: '%s'\n", dest );
return err;
}
void Examples()
{
strncat_s_tester( "hi ", "there", 4 );
strncat_s_tester( "hi ", "there", 5 );
strncat_s_tester( "hi ", "there", 6 );
printf_s( "\nDestination buffer too small:\n" );
strncat_s_tester( "hello ", "there", 4 );
printf_s( "\nTruncation examples:\n" );
errno_t err = strncat_s_tester( "hello ", "there", _TRUNCATE );
printf_s( " truncation %s occur\n", err == STRUNCATE ? "did"
: "did not" );
err = strncat_s_tester( "hello ", "!", _TRUNCATE );
printf_s( " truncation %s occur\n", err == STRUNCATE ? "did"
: "did not" );
printf_s( "\nSecure template overload example:\n" );
char dest[10] = "cats and ";
strncat( dest, "dachshunds", 15 );
// With secure template overloads enabled (see #define
// at top of file), the preceding line is replaced by
// strncat_s( dest, _countof(dest), "dachshunds", 15 );
// Instead of causing a buffer overrun, strncat_s invokes
// the invalid parameter handler.
// If secure template overloads were disabled, strncat would
// append "dachshunds" and overrun the dest buffer.
printf_s( " 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_s(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();
}
Equivalência do .NET Framework
Consulte também
Referência
Manipulação de cadeia de caracteres (CRT)
Interpretação de seqüências de caracteres Multibyte
strncmp, wcsncmp, _mbsncmp, _mbsncmp_l
strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l
_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l
strrchr, wcsrchr, _mbsrchr, _mbsrchr_l