Namespaces
Variants

mbsrtowcs, mbsrtowcs_s

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

wchar_t * restrict dst, rsize_t dstsz,
const char ** restrict src, rsize_t len,

mbstate_t * restrict ps ) ;
(2) (desde C11)
1) Convierte una secuencia de caracteres multibyte terminada en nulo, que comienza en el estado de conversión descrito por *ps , desde el array cuyo primer elemento está apuntado por * src a su representación de carácter ancho. Si dst no es nulo, los caracteres convertidos se almacenan en los elementos sucesivos del array wchar_t apuntado por dst . No se escriben más de len caracteres anchos en el array de destino. Cada carácter multibyte se convierte como si mediante una llamada a mbrtowc . La conversión se detiene si:
  • El carácter nulo multibyte fue convertido y almacenado. * src se establece al valor de puntero nulo y *ps representa el estado de desplazamiento inicial.
  • Se encontró un carácter multibyte inválido (según la configuración regional C actual). * src se establece para apuntar al inicio del primer carácter multibyte no convertido.
  • el siguiente carácter ancho a almacenar excedería len . * src se establece para apuntar al inicio del primer carácter multibyte no convertido. Esta condición no se verifica si dst es un puntero nulo.
2) Igual que (1) , excepto que
  • la función retorna su resultado como parámetro de salida retval
  • si no se escribió ningún carácter nulo en dst después de escribir len caracteres anchos, entonces L ' \0 ' se almacena en dst[len] , lo que significa que se escriben len+1 caracteres anchos en total
  • la función sobrescribe el array de destino desde el carácter 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 constraint handler actualmente instalada:
  • retval , ps , src , o * src es un puntero nulo
  • dstsz o len es mayor que RSIZE_MAX/sizeof(wchar_t) (a menos que dst sea nulo)
  • dstsz no es cero (a menos que dst sea nulo)
  • No hay carácter nulo en los primeros dstsz caracteres multibyte en el array * src y len es mayor que dstsz (a menos que dst sea nulo)
Como con todas las funciones con verificación de límites, mbsrtowcs_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 arreglo de caracteres anchos donde se almacenarán los resultados
src - puntero al puntero del primer elemento de una cadena multibyte terminada en nulo
len - número de caracteres anchos disponibles en el arreglo apuntado por dst
ps - puntero al objeto de estado de conversión
dstsz - número máximo de caracteres anchos que serán escritos (tamaño del dst array)
retval - puntero a un objeto size_t donde se almacenará el resultado

Valor de retorno

1) En caso de éxito, retorna el número de caracteres anchos, excluyendo el terminador L ' \0 ' , escritos en el arreglo de caracteres. Si dst es un puntero nulo, retorna el número de caracteres anchos que se habrían escrito dada una longitud ilimitada. En error de conversión (si se encontró un carácter multibyte inválido), retorna ( size_t ) - 1 , almacena EILSEQ en errno , y deja * ps en estado no especificado.
2) cero en caso de éxito (en cuyo caso el número de caracteres anchos 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 L ' \0 ' (a menos que dst sea nulo o dstmax sea cero o mayor que RSIZE_MAX )

Ejemplo

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

Salida:

Wide string: zß水🍌
The length, including L'\0': 5

Referencias

  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.29.6.4.1 La función mbsrtowcs (p: 445)
  • K.3.9.3.2.1 La función mbsrtowcs_s (p: 648-649)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.24.6.4.1 La función mbsrtowcs (p: 391)

Véase también

convierte una cadena de caracteres multibyte estrecha a cadena ancha
(función)
(C95)
convierte el siguiente carácter multibyte a carácter ancho, dado el estado
(función)
convierte una cadena ancha a cadena de caracteres multibyte estrecha, dado el estado
(función)