Condividi tramite


wcsrtombs_s

Converte una stringa di caratteri estesi nella relativa rappresentazione di stringa di caratteri multibyte. Una versione di wcsrtombs con miglioramenti della sicurezza come descritto in Funzionalità di sicurezza in 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

Parametri

  • [out] pReturnValue
    Numero di caratteri convertiti.

  • [out] mbstr
    L'indirizzo di un buffer per la stringa convertita risultante di caratteri multibyte.

  • [out] sizeInBytes
    La dimensione, in byte, del buffer mbstr.

  • [in] wcstr
    Punta alla stringa di caratteri estesi da convertire.

  • [in] count
    Numero massimo di byte da memorizzare nel buffer di mbstr, o _TRUNCATE.

  • [in] mbstate
    Un puntatore a un oggetto di conversione di stato mbstate_t.

Valore restituito

Zero se ha esito positivo, un codice di errore in caso di errore.

Condizione di errore

Valore di ritorno e errno

mbstr è NULL e sizeInBytes > 0

EINVAL

wcstr è NULL.

EINVAL

Il buffer di destinazione è troppo piccolo per contenere la stringa convertita (a meno che count sia _TRUNCATE; vedere i commenti di seguito)

ERANGE

Se tutte le condizioni si verificano, l'eccezione del parametro non valido viene invocata come descritto in Convalida dei parametri. Se all'esecuzione è permesso continuare, la funzione restituisce un codice di errore e imposta errno come indicato nella tabella.

Note

La funzione di wcsrtombs_s converte una stringa di caratteri di tipo puntati da wcstr in caratteri multibyte memorizzati nel buffer puntato da mbstr, utilizzando lo stato di conversione contenuto in mbstate. La conversione continuerà per ogni carattere finché non verrà soddisfatta una di queste condizioni:

  • Un carattere null di tipo "wide" viene rilevato

  • Un carattere di tipo "wide" che non può essere convertito viene rilevato

  • Il numero di byte memorizzati nel buffer mbstr equivale a count.

La stringa di destinazione è sempre con terminazione null (anche in caso di errore).

Se count è il valore speciale _TRUNCATE, allora wcsrtombs_s converte la stringa finché ci sta nel buffer di destinazione, pur lasciando spazio per un terminatore null.

Se wcsrtombs_s converte correttamente la stringa di origine, inserisce la dimensione in byte della stringa convertita, incluso il terminatore null, in *pReturnValue (il valore fornito pReturnValue non è NULL). Questo accade anche se l'argomento mbstr è NULL e consente di determinare la dimensione del buffer richiesto. Si noti che se mbstr è NULL, count viene ignorato.

Se wcsrtombs_s rileva un carattere di tipo "wide" non può convertire in un carattere multibyte, viene inserito 1 in *pReturnValue, imposta il buffer di destinazione su una stringa vuota, imposta errno a EILSEQ, e restituisce EILSEQ.

Se le sequenze puntate da wcstr e sovrapposizione mbstr, il comportamento wcsrtombs_s non è definito. wcsrtombs_s è influenzata dalla categoria di LC_TYPE delle impostazioni locali correnti.

Nota sulla sicurezzaNota sulla sicurezza

Assicurarsi che wcstr e mbstr non si sovrappongano e che count rifletta correttamente il numero di caratteri di tipo "wide" per la conversione.

La funzione wcsrtombs_s differisce da wcstombs_s, _wcstombs_s_l dalla sua possibilità di essere avviata nuovamente. Lo stato di conversione viene archiviato in mbstate per le chiamate successive alla stessa o ad altre funzioni avviabili nuovamente. I risultati non sono definiti quando si combina l'utilizzo delle funzioni avviabili nuovamente e non avviabili nuovamente. Ad esempio, un'applicazione utilizzerebbe wcsrlen anziché wcslen, se è stata utilizzata una chiamata successiva a wcsrtombs_s al posto di wcstombs_s.

In C++ l'utilizzo di queste funzioni è semplificato dagli overload dei modelli. Gli overload possono dedurre la lunghezza del buffer automaticamente (eliminando la necessità di specificare un argomento di dimensione) e possono sostituire automaticamente le funzioni precedenti e non sicure con le controparti più recenti e sicure. Per ulteriori informazioni, vedere Overload di modelli sicuri.

Eccezioni

La funzione wcsrtombs_s è multithread-safe mentre nessuna funzione nella thread corrente chiama setlocale mentre questa funzione è in esecuzione e mbstate è null.

Esempio

// 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" );
    }
}
  

Equivalente .NET Framework

Non applicabile. Per chiamare la funzione standard C, utilizzare PInvoke. Per ulteriori informazioni, vedere Esempi di Invocazione della Piattaforma.

Requisiti

Routine

Intestazione obbligatoria

wcsrtombs_s

<wchar.h>

Vedere anche

Riferimenti

Conversione dei dati

Impostazioni locali

Interpretazione di sequenze di caratteri multibyte

wcrtomb

wcrtomb_s

wctomb, _wctomb_l

wcstombs, _wcstombs_l

mbsinit