wcstombs, wcstombs_s
Depuis fr.cppreference.net
| Défini dans l'en-tête <stdlib.h>
|
||
size_t wcstombs( char* dst, const wchar_t* src, size_t len );
|
(1) | (jusqu'à C99) |
size_t wcstombs( char* restrict dst, const wchar_t* restrict src, size_t len );
|
(depuis C99) | |
errno_t wcstombs_s( size_t* restrict retval, char* restrict dst, rsize_t dstsz,
const wchar_t* restrict src, rsize_t len );
|
(2) | (depuis C11) |
1) Convertit une séquence de caractères larges du tableau dont le premier élément est pointé par
src en sa représentation multi-octets étroite qui commence dans l'état de décalage initial. Les caractères convertis sont stockés dans les éléments successifs du tableau de char pointé par dst. Pas plus de len octets sont écrits dans le tableau de destination. Chaque caractère est converti comme par un appel à wctomb, sauf que l'état de conversion de wctomb n'est pas affecté. La conversion s'arrête si :
- Le caractère nul
L'\0'a été converti et stocké. Les octets stockés dans ce cas sont la séquence de désynchronisation (si nécessaire) suivie de'\0', - A
wchar_ta été trouvé qui ne correspond pas à un caractère valide dans la locale C actuelle. - Le prochain caractère multi-octets à stocker dépasserait
len.
Si
src et dst se chevauchent, le comportement est indéfini.2) Identique à (1), sauf que
- la conversion est comme par wcrtomb, pas wctomb
- la fonction retourne son résultat comme un paramètre de sortie
retval - si la conversion s'arrête sans écrire un caractère nul, la fonction stockera
'\0'dans l'octet suivant dansdst, qui peut êtredst[len]oudst[dstsz], selon ce qui vient en premier (ce qui signifie jusqu'à len+1/dstsz+1 octets totaux peuvent être écrits). Dans ce cas, il peut n'y avoir aucune séquence de désynchronisation écrite avant le caractère nul de terminaison. - si
dstest un pointeur nul, le nombre d'octets qui seraient produits est stocké dans*retval - la fonction écrase le tableau de destination depuis le caractère nul de terminaison et jusqu'à
dstsz - Si
srcetdstse chevauchent, le comportement est indéfini. - les erreurs suivantes sont détectées à l'exécution et appellent la fonction gestionnaire de contrainte actuellement installée :
retvalousrcest un pointeur nuldstszoulenest supérieur à RSIZE_MAX (sauf sidstest nul)dstszn'est pas zéro (sauf sidstest nul)lenest supérieur àdstszet la conversion ne rencontre pas de caractère nul ou d'erreur d'encodage dans le tableausrcau moment oùdstszest atteint (sauf sidstest nul)
wcstombs_s n'est garantie d'être disponible que si __STDC_LIB_EXT1__ est défini par l'implémentation et si l'utilisateur définit __STDC_WANT_LIB_EXT1__ comme la constante entière 1 avant d'inclure <stdlib.h>.Notes
Dans la plupart des implémentations, wcstombs met à jour un objet statique global de type mbstate_t en parcourant la chaîne, et ne peut pas être appelé simultanément par deux threads, wcsrtombs ou wcstombs_s doivent être utilisés dans de tels cas.
POSIX spécifie une extension courante : si dst est un pointeur nul, cette fonction retourne le nombre d'octets qui seraient écrits dans dst, si converti. Un comportement similaire est standard pour wcsrtombs et wcstombs_s.
Paramètres
| dst | - | pointeur vers le tableau de caractères étroits où le caractère multi-octets sera stocké |
| src | - | pointeur vers le premier élément d'une chaîne large terminée par null à convertir |
| len | - | nombre d'octets disponibles dans le tableau pointé par dst |
| dstsz | - | nombre maximal d'octets qui seront écrits (taille du tableau dst)
|
| retval | - | pointeur vers un objet size_t où le résultat sera stocké |
Valeur de retour
1) En cas de succès, retourne le nombre d'octets (y compris les éventuelles séquences de décalage, mais excluant le
'\0' de terminaison) écrits dans le tableau de caractères dont le premier élément est pointé par dst. En cas d'erreur de conversion (si un caractère large invalide a été rencontré), retourne (size_t)-1.2) Retourne zéro en cas de succès (dans ce cas le nombre d'octets excluant le zéro de terminaison qui ont été ou auraient été écrits dans
dst, est stocké dans *retval), non nul en cas d'erreur. En cas de violation de contrainte d'exécution, stocke (size_t)-1 dans *retval (sauf si retval est nul) et définit dst[0] à '\0' (sauf si dst est nul ou si dstmax est zéro ou supérieur à RSIZE_MAX)Exemple
Exécuter ce code
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// 4 wide characters
const wchar_t src[] = L"z\u00df\u6c34\U0001f34c";
// they occupy 10 bytes in UTF-8
char dst[11];
setlocale(LC_ALL, "en_US.utf8");
printf("wide-character string: '%ls'\n",src);
for (size_t ndx = 0; ndx < sizeof src / sizeof src[0]; ++ndx)
printf(" src[%2zu] = %#8x\n", ndx, src[ndx]);
int rtn_val = wcstombs(dst, src, sizeof dst);
printf("rtn_val = %d\n", rtn_val);
if (rtn_val > 0)
printf("multibyte string: '%s'\n",dst);
for (size_t ndx = 0; ndx < sizeof dst; ++ndx)
printf(" dst[%2zu] = %#2x\n", ndx, (unsigned char)dst[ndx]);
}
Sortie :
wide-character string: 'zß水🍌'
src[ 0] = 0x7a
src[ 1] = 0xdf
src[ 2] = 0x6c34
src[ 3] = 0x1f34c
src[ 4] = 0
rtn_val = 10
multibyte string: 'zß水🍌'
dst[ 0] = 0x7a
dst[ 1] = 0xc3
dst[ 2] = 0x9f
dst[ 3] = 0xe6
dst[ 4] = 0xb0
dst[ 5] = 0xb4
dst[ 6] = 0xf0
dst[ 7] = 0x9f
dst[ 8] = 0x8d
dst[ 9] = 0x8c
dst[10] = 0
Références
- Norme C23 (ISO/IEC 9899:2024) :
- 7.22.8.2 La fonction wcstombs (p: TBD)
- K.3.6.5.2 La fonction wcstombs_s (p: TBD)
- Norme C17 (ISO/IEC 9899:2018) :
- 7.22.8.2 La fonction wcstombs (p: TBD)
- K.3.6.5.2 La fonction wcstombs_s (p: TBD)
- Norme C11 (ISO/IEC 9899:2011) :
- 7.22.8.2 La fonction wcstombs (p: 360)
- K.3.6.5.2 La fonction wcstombs_s (p: 612-614)
- Norme C99 (ISO/IEC 9899:1999) :
- 7.20.8.2 La fonction wcstombs (p: 324)
- Norme C89/C90 (ISO/IEC 9899:1990) :
- 4.10.8.2 La fonction wcstombs
Voir aussi
(C95)(C11) |
convertit une chaîne large en chaîne de caractères multi-octets étroite, avec état donné (fonction) |
(C11) |
convertit une chaîne de caractères multi-octets étroite en chaîne large (fonction) |
Documentation C++ pour wcstombs
| |