Namespaces
Variants

mbsrtowcs, mbsrtowcs_s

From cppreference.net
Défini dans l'en-tête <wchar.h>
(1)
size_t mbsrtowcs ( wchar_t * dst, const char ** src, size_t len, mbstate_t * ps ) ;
(depuis C95)
(jusqu'à C99)
size_t mbsrtowcs ( wchar_t * restrict dst, const char ** restrict src, size_t len,
mbstate_t * restrict ps ) ;
(depuis 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) (depuis C11)
1) Convertit une séquence de caractères multioctets terminée par un caractère nul, qui commence dans l'état de conversion décrit par *ps , depuis le tableau dont le premier élément est pointé par * src vers sa représentation en caractères larges. Si dst n'est pas nul, les caractères convertis sont stockés dans les éléments successifs du tableau wchar_t pointé par dst . Pas plus de len caractères larges ne sont écrits dans le tableau de destination. Chaque caractère multioctet est converti comme par un appel à mbrtowc . La conversion s'arrête si :
  • Le caractère nul multioctet a été converti et stocké. * src est défini sur la valeur de pointeur nul et *ps représente l'état de décalage initial.
  • Un caractère multioctet invalide (selon la locale C actuelle) a été rencontré. * src est défini pour pointer au début du premier caractère multioctet non converti.
  • le prochain caractère large à stocker dépasserait len . * src est défini pour pointer au début du premier caractère multioctet non converti. Cette condition n'est pas vérifiée si dst est un pointeur nul.
2) Identique à (1) , sauf que
  • la fonction retourne son résultat comme paramètre de sortie retval
  • si aucun caractère nul n'a été écrit dans dst après que len caractères larges aient été écrits, alors L ' \0 ' est stocké dans dst[len] , ce qui signifie que len+1 caractères larges au total sont écrits
  • la fonction écrase le tableau de destination depuis le caractère nul de fin jusqu'à dstsz
  • Si src et dst se chevauchent, le comportement est indéfini.
  • les erreurs suivantes sont détectées à l'exécution et appellent la fonction gestionnaire de contraintes actuellement installée :
  • retval , ps , src , ou * src est un pointeur nul
  • dstsz ou len est supérieur à RSIZE_MAX/sizeof(wchar_t) (sauf si dst est nul)
  • dstsz n'est pas zéro (sauf si dst est nul)
  • Il n'y a pas de caractère nul dans les premiers dstsz caractères multi-octets du tableau * src et len est supérieur à dstsz (sauf si dst est nul)
Comme pour toutes les fonctions à vérification de limites, mbsrtowcs_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__ à la constante entière 1 avant d'inclure <wchar.h> .

Table des matières

Paramètres

dst - pointeur vers le tableau de caractères larges où les résultats seront stockés
src - pointeur vers le pointeur du premier élément d'une chaîne multioctet terminée par null
len - nombre de caractères larges disponibles dans le tableau pointé par dst
ps - pointeur vers l'objet d'état de conversion
dstsz - nombre maximum de caractères larges qui seront écrits (taille du dst tableau)
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 de caractères larges, à l'exclusion du caractère de fin L ' \0 ' , écrits dans le tableau de caractères. Si dst est un pointeur nul, retourne le nombre de caractères larges qui auraient été écrits avec une longueur illimitée. En cas d'erreur de conversion (si un caractère multioctet invalide a été rencontré), retourne ( size_t ) - 1 , stocke EILSEQ dans errno , et laisse * ps dans un état non spécifié.
2) zéro en cas de succès (auquel cas le nombre de caractères larges, à l'exclusion du zéro terminal, qui ont été ou seraient écrits dans dst , est stocké dans * retval ), non-zéro 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 ] à L ' \0 ' (sauf si dst est nul ou dstmax est zéro ou supérieur à RSIZE_MAX )

Exemple

#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ß水🍌"
}

Sortie :

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

Références

  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.29.6.4.1 La fonction mbsrtowcs (p: 445)
  • K.3.9.3.2.1 La fonction mbsrtowcs_s (p: 648-649)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.24.6.4.1 La fonction mbsrtowcs (p: 391)

Voir aussi

convertit une chaîne de caractères multioctets étroite en chaîne large
(fonction)
(C95)
convertit le prochain caractère multioctet en caractère large, avec état
(fonction)
convertit une chaîne large en chaîne de caractères multioctets étroite, avec état
(fonction)
Documentation C++ pour mbsrtowcs