Namespaces
Variants

wcsncpy, wcsncpy_s

De es.cppreference.net
< c | cadena | ancho
 
 
 
 
Definido en el encabezado <wchar.h>
wchar_t* wcsncpy( wchar_t* dest, const wchar_t* src, size_t count );
(1) (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 ancho nulo de terminación) al arreglo de caracteres anchos apuntado por dest.
Si se alcanza count antes de que se haya copiado toda la cadena src, el arreglo de caracteres anchos resultante no termina en nulo.
Si, después de copiar el carácter ancho nulo de terminación desde src, no se alcanza count, se escriben caracteres anchos nulos adicionales en dest hasta que se haya escrito un total de count caracteres.
Si las cadenas se superponen, el comportamiento no está definido.
2) Igual que (1), excepto que la función no continúa escribiendo ceros en el arreglo destino para rellenar hasta count, se detiene después de escribir el carácter nulo de terminación (si no había nulo en la fuente, escribe uno en dest[count] y luego se detiene). También, los siguientes errores se detectan en tiempo de ejecución y llaman a la función manejador de restricción 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 todas las funciones con verificación de límites, wcsncpy_s solo está garantizada como disponible si __STDC_LIB_EXT1__ está definida por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <wchar.h>.

Parámetros

dest - puntero al arreglo de caracteres anchos donde 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 destino

Valor de retorno

1) devuelve una copia de dest
2) devuelve cero en caso de éxito, devuelve un valor 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 arreglo destino con valores no especificados.

Notas

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

Aunque el truncamiento para ajustarse al búfer destino es un riesgo de seguridad y por lo tanto una violación de restricción en tiempo de ejecución para wcsncpy_s, es posible obtener el comportamiento de truncamiento especificando count igual al tamaño del arreglo destino menos uno: copiará los primeros count caracteres anchos y agregará el terminador ancho nulo como siempre:

size_t count = sizeof dst / sizeof *dst;
wcsncpy_s(dst, count, src, count - 1);

Ejemplo

#include <locale.h>
#include <stdio.h>
#include <wchar.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 ");
    }
}

Posible salida:

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

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.31.4.2.2 La función wcsncpy (p: 438)
  • K.3.9.3.1.2 La función wcsncpy_s (p: 663-664)
  • 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 una cierta cantidad de caracteres anchos entre dos arreglos que no se superponen
(función)
copia una cierta cantidad de caracteres de una cadena a otra
(función)