wcsrtombs, wcsrtombs_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 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 sidstes 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
srcydstse 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 -
dstszolenes mayor que RSIZE_MAX (a menos quedstsea nulo) -
dstszno es cero (a menos quedstsea nulo) -
lenes mayor quedstszy la conversión no encuentra nulo o error de codificación en el arraysrccuando se alcanzadstsz(a menos quedstsea nulo)
-
-
Como con todas las funciones con verificación de límites,
wcsrtombs_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 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
Ejecutar este código
#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
|
(C11)
|
convierte una cadena ancha en una cadena de caracteres multibyte estrecha
(función) |
|
(C95)
(C11)
|
convierte un carácter ancho a su representación multibyte, dado un estado
(función) |
|
(C95)
(C11)
|
convierte una cadena de caracteres multibyte estrecha a cadena ancha, dado un estado
(función) |
|
Documentación de C++
para
wcsrtombs
|
|