strncpy
, _strncpy_l
, wcsncpy
, _wcsncpy_l
, , _mbsncpy
, _mbsncpy_l
Copie los caracteres de una cadena en otra. Hay disponibles versiones más seguras de estas funciones; consulte strncpy_s
, _strncpy_s_l
, wcsncpy_s
, _wcsncpy_s_l
, _mbsncpy_s
, _mbsncpy_s_l
.
Importante
_mbsncpy
y _mbsncpy_l
no se pueden usar en aplicaciones que se ejecutan en Windows en tiempo de ejecución. Para obtener más información, vea Funciones de CRT no admitidas en aplicaciones de la Plataforma universal de Windows.
Sintaxis
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
Parámetros
strDest
Cadena de destino.
strSource
Cadena de origen.
count
Número de caracteres que se van a copiar.
locale
Configuración regional que se va a usar.
Valor devuelto
Devuelve strDest
. No se reserva ningún valor devuelto para indicar un error.
Comentarios
La función strncpy
copia los primeros count
caracteres de strSource
en strDest
y devuelve strDest
. Si count
es menor o igual que la longitud de strSource
, un carácter NULL no se anexa automáticamente a la cadena copiada. Si count
es mayor que la longitud de strSource
, a cadena de destino se completa con caracteres nulos hasta la longitud count
. El comportamiento de strncpy
no se define si las cadenas de origen y de destino se superponen.
Importante
strncpy
no comprueba si hay espacio suficiente en strDest
, lo que la convierte en una posible causa de saturaciones del búfer. El argumento count
limita el número de caracteres que se copian, no el tamaño de strDest
. Consulte el ejemplo siguiente. Para obtener más información, consulte Evitar saturaciones del búfer.
Si strDest
o strSource
es un NULL
puntero, o si count
es menor o igual que cero, se invoca al controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, estas funciones devuelven -1 y establecen errno
en EINVAL
.
wcsncpy
y _mbsncpy
son versiones de caracteres anchos y multibyte de strncpy
. Los argumentos y el valor devuelto de wcsncpy
y _mbsncpy
varían en consecuencia. Por lo demás, estas seis funciones se comportan exactamente igual.
Las versiones de estas funciones con el sufijo _l
son idénticas salvo que usan la configuración regional pasada en lugar de la configuración regional de su comportamiento dependiente de la configuración regional. Para obtener más información, vea Locale.
En C++, estas funciones tienen sobrecargas de plantilla que invocan los homólogos seguros más recientes de estas funciones. Para obtener más información, consulte Sobrecargas de plantilla seguras.
De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.
Asignaciones de rutinas de texto genérico
Rutina TCHAR.H |
_UNICODE y _MBCS no definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tcsncpy |
strncpy |
_mbsnbcpy |
wcsncpy |
_tcsncpy_l |
_strncpy_l |
_mbsnbcpy_l |
_wcsncpy_l |
Nota:
_strncpy_l
y _wcsncpy_l
no dependen de la configuración regional; se proporcionan solo para _tcsncpy_l
y no se han diseñado para recibir llamadas directamente.
Requisitos
Routine | Encabezado necesario |
---|---|
strncpy |
<string.h> |
wcsncpy |
<string.h> o <wchar.h> |
_mbsncpy , _mbsncpy_l |
<mbstring.h> |
Para obtener más información de compatibilidad de la plataforma, consulte Compatibilidad.
Ejemplo
En el ejemplo siguiente se muestra el uso de strncpy
y cómo su uso incorrecto puede provocar errores de programa y problemas de seguridad. El compilador genera una advertencia para cada llamada a strncpy
similar a crt_strncpy_x86.c(15)
: Advertencia C4996: "strncpy
": Esta función o variable puede no ser segura. Considere la posibilidad de usar strncpy_s
en su lugar. Para deshabilitar el desuso, use _CRT_SECURE_NO_WARNINGS
. Consulte la Ayuda en línea para más informació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.
}
Output
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')
El diseño de las variables automáticas y el nivel de detección de errores y protección del código pueden variar con la configuración de compilador modificada. Este ejemplo puede tener resultados diferentes si se crea en otros entornos de compilación o con otras opciones del compilador.
Consulte también
Manipulación de cadenas
Configuración regional
Interpretación de secuencias de caracteres de varios bytes
_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