mbsrtowcs, mbsrtowcs_s
From cppreference.net
|
Definido en el encabezado
<wchar.h>
|
||
| (1) | ||
|
(desde C95)
(hasta C99) |
||
| (desde C99) | ||
| (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
*psrepresenta 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 sidstes 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
dstdespués de escribirlencaracteres anchos, entonces L ' \0 ' se almacena endst[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
srcydstse 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 -
dstszolenes mayor que RSIZE_MAX/sizeof(wchar_t) (a menos quedstsea nulo) -
dstszno es cero (a menos quedstsea nulo) -
No hay carácter nulo en los primeros
dstszcaracteres multibyte en el array * src ylenes mayor quedstsz(a menos quedstsea nulo)
-
-
Como con todas las funciones con verificación de límites,
mbsrtowcs_ssolo 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
Ejecutar este código
#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
|
(C11)
|
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) |
|
(C95)
(C11)
|
convierte una cadena ancha a cadena de caracteres multibyte estrecha, dado el estado
(función) |
|
Documentación de C++
para
mbsrtowcs
|
|