Namespaces
Variants

wcsrtombs, wcsrtombs_s

From cppreference.net
Definido en el encabezado <wchar.h>
(1)
size_t wcsrtombs ( char * dst, const wchar_t ** src, size_t len, mbstate_t * ps ) ;
(desde C95)
(hasta C99)
size_t wcsrtombs ( char * restrict dst, const wchar_t ** restrict src, size_t len,
mbstate_t * restrict ps ) ;
(desde C99)
errno_t wcsrtombs_s ( size_t * restrict retval, char * restrict dst, rsize_t dstsz,

const wchar_t ** restrict src, rsize_t len,

mbstate_t * restrict ps ) ;
(2) (desde C11)
1) Convierte una secuencia de caracteres anchos del array cuyo primer elemento está apuntado por * src a su representación multibyte estrecha que comienza en el estado de conversión descrito por * ps . Si dst no es nulo, los caracteres convertidos se almacenan en los elementos sucesivos del array de char apuntado por dst . No se escriben más de len bytes en el array de destino. Cada carácter se convierte como si mediante una llamada a wcrtomb . La conversión se detiene si:
  • El carácter nulo L ' \0 ' fue convertido y almacenado. Los bytes almacenados en este caso son la secuencia de desbloqueo (si es necesaria) seguida por ' \0 ' , * src se establece al valor de puntero nulo y * ps representa el estado de desplazamiento inicial.
  • Se encontró un wchar_t que no corresponde a un carácter válido en la localidad C actual. * src se establece para apuntar al primer carácter ancho no convertido.
  • el siguiente carácter multibyte a almacenar excedería len . * src se establece para apuntar al primer carácter ancho no convertido. Esta condición no se verifica si dst es un puntero nulo.
2) Igual que (1) , excepto que
  • la función devuelve su resultado como un parámetro de salida retval
  • si la conversión se detiene sin escribir un carácter nulo, la función almacenará ' \0 ' en el siguiente byte en dst , que puede ser dst [ len ] o dst [ dstsz ] , el que ocurra primero (lo que significa que se pueden escribir hasta len+1/dstsz+1 bytes en total). En este caso, puede que no se escriba una secuencia de desbloqueo antes del nulo terminador.
  • la función sobrescribe el array de destino desde el nulo terminador hasta dstsz
  • Si src y dst se superponen, el comportamiento no está especificado.
  • los siguientes errores se detectan en tiempo de ejecución y llaman a la función manejadora de restricciones actualmente instalada:
  • retval , ps , src , o * src es un puntero nulo
  • dstsz o len es mayor que RSIZE_MAX (a menos que dst sea nulo)
  • dstsz no es cero (a menos que dst sea nulo)
  • len es mayor que dstsz y la conversión no encuentra nulo o error de codificación en el array src cuando se alcanza dstsz (a menos que dst sea nulo)
Como con todas las funciones con verificación de límites, wcsrtombs_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

dst - puntero al array de caracteres estrechos donde se almacenarán los caracteres multibyte
src - puntero a puntero del primer elemento de una cadena ancha terminada en nulo
len - número de bytes disponibles en el array apuntado por dst
ps - puntero al objeto de estado de conversión
dstsz - número máximo de bytes que serán escritos (tamaño del dst array)
retval - puntero a un size_t objeto donde se almacenará el resultado

Valor de retorno

1) En caso de éxito, retorna el número de bytes (incluyendo cualquier secuencia de desplazamiento, pero excluyendo el terminador ' \0 ' ) escritos en el arreglo de caracteres cuyo primer elemento es apuntado por dst . Si dst es un puntero nulo, retorna el número de bytes que habrían sido escritos. En error de conversión (si se encontró un carácter ancho inválido), retorna ( size_t ) - 1 , almacena EILSEQ en errno , y deja * ps en estado no especificado.
2) Retorna cero en caso de éxito (en cuyo caso el número de bytes excluyendo el cero terminador que fueron, o serían escritos en dst , se almacena en * retval ), distinto de cero en caso de error. En caso de violación de restricción en tiempo de ejecución, almacena ( size_t ) - 1 en * retval (a menos que retval sea nulo) y establece dst [ 0 ] a ' \0 ' (a menos que dst sea nulo o dstmax sea cero o mayor que RSIZE_MAX )

Ejemplo

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
void print_wide(const wchar_t* wstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    size_t len = 1 + wcsrtombs(NULL, &wstr, 0, &state);
    char mbstr[len];
    wcsrtombs(mbstr, &wstr, len, &state);
    printf("Multibyte string: %s\n", mbstr);
    printf("Length, including '\\0': %zu\n", len);
}
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    print_wide(L"z\u00df\u6c34\U0001f34c"); // or L"zß水🍌"
}

Salida:

Multibyte string: zß水🍌
Length, including '\0': 11

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.29.6.4.2 La función wcsrtombs (p: 324-325)
  • K.3.9.3.2.2 La función wcsrtombs_s (p: 471-472)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.29.6.4.2 La función wcsrtombs (p: 446)
  • K.3.9.3.2.2 La función wcsrtombs_s (p: 649-651)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.24.6.4.2 La función wcsrtombs (p: 392)

Véase también

convierte una cadena ancha en una cadena de caracteres multibyte estrecha
(función)
convierte un carácter ancho a su representación multibyte, dado un estado
(función)
convierte una cadena de caracteres multibyte estrecha a cadena ancha, dado un estado
(función)