Namespaces
Variants

wcsncpy, wcsncpy_s

From cppreference.net
< c ‎ | string ‎ | wide
Definido en el encabezado <wchar.h>
(1)
wchar_t * wcsncpy ( wchar_t * dest, const wchar_t * src, size_t count ) ;
(desde C95)
(hasta C99)
wchar_t * wcsncpy ( wchar_t * restrict dest, const wchar_t * restrict src, size_t count ) ;
(desde C99)
errno_t wcsncpy_s ( wchar_t * restrict dest, rsize_t destsz,
const wchar_t * restrict src, rsize_t count ) ;
(2) (desde C11)
1) Copia como máximo count caracteres de la cadena ancha apuntada por src (incluyendo el carácter nulo terminador) al arreglo de caracteres anchos apuntado por dest .
Si count se alcanza antes de que toda la cadena src sea copiada, el array de caracteres anchos resultante no está terminado en nulo.
Si, después de copiar el carácter ancho nulo de terminación desde src , count no se alcanza, se escriben caracteres anchos nulos adicionales en dest hasta que se hayan escrito un total de count caracteres.
Si las cadenas se superponen, el comportamiento es indefinido.
2) Igual que (1) , excepto que la función no continúa escribiendo ceros en el array de destino para rellenar hasta count , se detiene después de escribir el carácter nulo terminador (si no había un nulo en la fuente, escribe uno en dest [ count ] y luego se detiene). Además, los siguientes errores se detectan en tiempo de ejecución y llaman a la función constraint handler actualmente instalada:
  • src o dest es un puntero nulo
  • destsz o count es cero o mayor que RSIZE_MAX / sizeof ( wchar_t )
  • count es mayor o igual a destsz , pero destsz es menor o igual a wcsnlen_s ( src, count ) , en otras palabras, ocurriría truncamiento
  • ocurriría superposición entre las cadenas fuente y destino
Como con todas las funciones con verificación de límites, wcsncpy_s solo está garantizada que esté disponible si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <wchar.h> .

Contenidos

Parámetros

dest - puntero al array de caracteres anchos al que copiar
src - puntero a la cadena ancha desde la que copiar
count - número máximo de caracteres anchos a copiar
destsz - tamaño del búfer de destino

Valor de retorno

1) devuelve una copia de dest
2) retorna cero en caso de éxito, retorna distinto de cero en caso de error. Además, en caso de error, escribe L ' \0 ' en dest [ 0 ] (a menos que dest sea un puntero nulo o destsz sea cero o mayor que RSIZE_MAX / sizeof ( wchar_t ) ) y puede sobrescribir el resto del array de destino con valores no especificados.

Notas

En un uso típico, count es el número de elementos en el array de destino.

Aunque el truncamiento para ajustarse al búfer de destino es un riesgo de seguridad y, por lo tanto, una violación de las restricciones en tiempo de ejecución para wcsncpy_s , es posible obtener el comportamiento de truncamiento especificando count igual al tamaño del array de destino menos uno: copiará los primeros count caracteres anchos y añadirá el terminador nulo ancho como siempre: wcsncpy_s ( dst, sizeof dst / sizeof * dst, src, ( sizeof dst / sizeof * dst ) - 1 ) ;

Ejemplo

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
    const wchar_t src[] = L"わゐ";
    wchar_t dest[6] = {L'あ', L'い', L'う', L'え', L'お'};
    wcsncpy(dest, src, 4); // this will copy わゐ and repeat L'\0' two times
    puts("The contents of dest are: ");
    setlocale(LC_ALL, "en_US.utf8");
    const long dest_size = sizeof dest / sizeof *dest;
    for(wchar_t* p = dest; p-dest != dest_size; ++p) {
        *p ? printf("%lc ", *p)
           : printf("\\0 ");
    }
}

Salida posible:

The contents of dest are: 
わ ゐ \0 \0 お \0

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.29.4.2.2 La función wcsncpy (p: 314)
  • K.3.9.2.1.2 La función wcsncpy_s (p: 464)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.29.4.2.2 La función wcsncpy (p: 431)
  • K.3.9.2.1.2 La función wcsncpy_s (p: 640-641)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.24.4.2.2 La función wcsncpy (p: 377)

Véase también

(C95) (C11)
copia una cadena ancha a otra
(función)
copia cierta cantidad de caracteres anchos entre dos arreglos no superpuestos
(función)
copia cierta cantidad de caracteres de una cadena a otra
(función)