Partager via


wcsrtombs_s

Convertir une chaîne de caractères larges en sa représentation de chaîne de caractères multioctets. Il s'agit de versions de wcsrtombs avec des améliorations de sécurité, comme décrit dans Fonctionnalités de sécurité dans le CRT.

errno_t wcsrtombs_s(
   size_t *pReturnValue,
   char *mbstr,
   size_t sizeInBytes,
   const wchar_t **wcstr,
   sizeof count,
   mbstate_t *mbstate
);
template <size_t size>
errno_t wcsrtombs_s(
   size_t *pReturnValue,
   char (&mbstr)[size],
   const wchar_t **wcstr,
   sizeof count,
   mbstate_t *mbstate
); // C++ only

Paramètres

  • [out] pReturnValue
    Nombre de caractères convertis.

  • [out] mbstr
    L'adresse d'un tampon pour la chaîne de caractères multioctets convertie résultante.

  • [out] sizeInBytes
    La taille en octets de la mémoire tampon mbstr.

  • [in] wcstr
    Pointe vers la chaîne de caractères larges à convertir.

  • [in] count
    Nombre maximal d'octets à stocker dans la mémoire tampon mbstr, ou _TRUNCATE.

  • [in] mbstate
    Un pointeur vers un objet d'état de conversion mbstate_t .

Valeur de retour

Zéro si l'opération a réussi, code d'erreur en cas de échec.

Condition d'erreur

Valeur de retour et errno

mbstr est NULL et sizeInBytes > 0

EINVAL

wcstr est NULL

EINVAL

La mémoire tampon de destination est trop petite pour contenir la chaîne convertie (à moins que count est _TRUNCATE; consultez les notes ci-dessous)

ERANGE

Si l'une de ces conditions d'erreur se produit, le gestionnaire de paramètre non valide est appelé, comme décrit dans Validation de paramètre. Si l'exécution est autorisée à continuer, la fonction retourne un code d'erreur et définit errno comme indiqué dans la table.

Notes

La fonction wcsrtombs_s convertit une chaîne de caractères larges référencés par wcstr en caractères multioctets stockés dans la mémoire tampon désignée par mbstr, en utilisant l'état de conversion contenu dans mbstate. La conversion se poursuit pour chaque caractère tant qu'une des conditions suivantes est remplie :

  • Un caractère large NULL est rencontré

  • Un caractère large qui ne peut pas être converti est produit

  • Le nombre d'octets stockés en mémoire tampon mbstr est égal à count.

La chaîne de destination est toujours terminée par null (même en cas d'erreur).

Si count est la valeur spéciale _TRUNCATE, alors wcsrtombs_s convertit autant de la chaîne que ce qui s'insérera dans la mémoire tampon de destination, tout en laissant toujours de l'espace pour une marque de fin null.

Si wcsrtombs_s convertit correctement la chaîne source, elle définit la taille en octets de la chaîne convertie, notamment la marque de fin null, dans *pReturnValue ( dans la cas où pReturnValue n'est pas NULL). Cela se produit même si l'argument mbstr est NULL et permet de déterminer la taille de mémoire tampon requise. Notez que si mbstr est NULL, count est ignoré.

Si wcsrtombs_s rencontre un caractère large qu'il ne peut pas convertir en caractères multioctets, il met -1 dans *pReturnValue, définit la mémoire tampon de destination comme une chaîne vide, définit errno à EILSEQ, et retourne EILSEQ.

Si les séquences désignées par wcstr et mbstr se chevauchent, le comportement de wcsrtombs_s n'est pas défini. wcsrtombs_s est affecté par la catégorie LC_TYPE des paramètres régionaux actuels.

Note de sécuritéNote de sécurité

Vérifiez que wcstr et mbstr ne se chevauchent pas, et que count reflète fidèlement le nombre de caractères larges à convertir.

La fonction wcsrtombs_s diffère de wcstombs_s, _wcstombs_s_l par sa capacité à redémarrer. L'état de conversion est stocké dans mbstate pour d'autres appels à la même ou a d'autres fonctions redémarrable. Les résultats sont indéfinis lorqu'on mélange l'utilisation de fonctions redémarrable et non redémarrable. Par exemple, une application utilise wcsrlen plutôt que wcslen, si l'appel suivant à wcsrtombs_s est utilisé à la place de wcstombs_s.

En C++, l'utilisation de ces fonctions est simplifiée par les surcharges de modèle ; les surcharges peuvent déduire la longueur de la mémoire tampon automatiquement (ce qui évite d'avoir à spécifier un argument taille) et peuvent remplacer automatiquement les fonctions plus anciennes et non sécurisées par leurs équivalentes plus récentes et sécurisées. Pour plus d'informations, consultez Sécuriser les surcharges de modèle.

Exceptions

La fonction wcsrtombs_s est multithread-safe à condition qu'aucune fonction du thread actuel n'appelle setlocale lorsque cette fonction s'exécute et que mbstate est null.

Exemple

// crt_wcsrtombs_s.cpp
// 
// This code example converts a wide
// character string into a multibyte
// character string.
//

#include <stdio.h>
#include <memory.h>
#include <wchar.h>
#include <errno.h>

#define MB_BUFFER_SIZE 100

void main()
{
    const wchar_t   wcString[] = 
                    {L"Every good boy does fine."};
    const wchar_t   *wcsIndirectString = wcString;
    char            mbString[MB_BUFFER_SIZE];
    size_t          countConverted;
    errno_t         err;
    mbstate_t       mbstate;

    // Reset to initial shift state
    ::memset((void*)&mbstate, 0, sizeof(mbstate));

    err = wcsrtombs_s(&countConverted, mbString, MB_BUFFER_SIZE,
                      &wcsIndirectString, MB_BUFFER_SIZE, &mbstate);
    if (err == EILSEQ)
    {
        printf( "An encoding error was detected in the string.\n" );
    }
    else 
    {
        printf( "The string was successfully converted.\n" );
    }
}
  

Équivalent .NET Framework

Non applicable. Pour appeler la fonction C standard, utilisez PInvoke. Pour plus d'informations, consultez Exemples d'appel de plateforme.

Configuration requise

Routine

En-tête requis

wcsrtombs_s

<wchar.h>

Voir aussi

Référence

Conversion de données

Paramètres régionaux

Interprétation des séquences de caractères multioctets

wcrtomb

wcrtomb_s

wctomb, _wctomb_l

wcstombs, _wcstombs_l

mbsinit