Condividi tramite


vscanf_s, vwscanf_s

Legge i dati formattati dal flusso di input standard. Queste versioni di hanno vwscanfmiglioramenti pervscanf la sicurezza, come descritto in Funzionalità di sicurezza in CRT.

Sintassi

int vscanf_s(
   const char *format,
   va_list arglist
);
int vwscanf_s(
   const wchar_t *format,
   va_list arglist
);

Parametri

format
Stringa di formato controllo.

arglist
Elenco di argomenti variabili.

Valore restituito

Restituisce il numero di campi convertiti e assegnati correttamente; Il valore restituito non include campi letti ma non assegnati. Un valore restituito pari a 0 indica che nessun campo è stato assegnato. Il valore restituito èEOF per un errore o se viene rilevato il carattere di fine del file o il carattere di fine della stringa durante il primo tentativo di leggere un carattere. Se format è un NULL puntatore, viene richiamato il gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, vscanf_s e vwscanf_s restituiscono EOF e impostano errno su EINVAL.

Per informazioni su questi e altri codici di errore, vedere errno, _doserrno, _sys_errliste _sys_nerr.

Osservazioni:

La funzione vscanf_s legge i dati dal flusso di input standard stdin e scrive i dati nelle posizioni specificate dall'elenco di argomenti arglist. Ogni argomento nell'elenco deve essere un puntatore a una variabile di un tipo corrispondente a un identificatore di tipo in format. Se la copia avviene tra stringhe che si sovrappongono, il comportamento non è definito.

vwscanf_s è una versione a caratteri wide di vscanf_s; l'argomento format in vwscanf_s è una stringa di caratteri wide. vwscanf_s e vscanf_s si comportano in modo analogo, se il flusso viene aperto in modalità ANSI. vscanf_s non supporta l'input da un flusso UNICODE.

Diversamente da e , e richiedono che le dimensioni del buffer vengano specificate per tutti i parametri di input di tipo c, C, s, S o set di controlli stringa racchiusi in [].vwscanf_s vscanf_s vwscanfvscanf Le dimensioni del buffer in caratteri vengono passate come un altro parametro immediatamente dopo il puntatore al buffer o alla variabile. Le dimensioni del buffer in caratteri per una wchar_t stringa non corrispondono alle dimensioni in byte.

La dimensione del buffer include il carattere di terminazione null. È possibile usare un campo di specifica della larghezza per assicurarsi che il token che viene letto possa essere inserito nel buffer. Se non viene usato alcun campo di specifica della larghezza e il token letto in è troppo grande per adattarsi al buffer, non viene scritto nulla in tale buffer.

Nota

Il size parametro è di tipo unsigned, non size_t.

Per altre informazioni, vedere Specifica della larghezza per scanf.

Mapping di routine di testo generico

Routine TCHAR.H _UNICODE e _MBCS non definito _MBCS definito _UNICODE definito
_vtscanf_s vscanf_s vscanf_s vwscanf_s

Per altre informazioni, vedere Formattare i campi delle specifiche: scanf e wscanf le funzioni.

Requisiti

Ciclo Intestazione obbligatoria
vscanf_s <stdio.h>
wscanf_s <stdio.h> o <wchar.h>

La console non è supportata nelle app piattaforma UWP (Universal Windows Platform) (UWP). Gli handle di flusso standard associati alla console, stdin, stdoute stderrdevono essere reindirizzati prima che le funzioni di runtime C possano usarle nelle app UWP. Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

// crt_vscanf_s.c
// compile with: /W3
// This program uses the vscanf_s and vwscanf_s functions
// to read formatted input.

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

int call_vscanf_s(char *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vscanf_s(format, arglist);
    va_end(arglist);
    return result;
}

int call_vwscanf_s(wchar_t *format, ...)
{
    int result;
    va_list arglist;
    va_start(arglist, format);
    result = vwscanf_s(format, arglist);
    va_end(arglist);
    return result;
}

int main( void )
{
    int   i, result;
    float fp;
    char  c, s[81];
    wchar_t wc, ws[81];
    result = call_vscanf_s("%d %f %c %C %s %S", &i, &fp, &c, 1,
                           &wc, 1, s, _countof(s), ws, _countof(ws) );
    printf( "The number of fields input is %d\n", result );
    printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws);
    result = call_vwscanf_s(L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
                            &wc, 1, s, _countof(s), ws, _countof(ws) );
    wprintf( L"The number of fields input is %d\n", result );
    wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s, ws);
}

Quando questo programma riceve l'input nell'esempio, produce l'output seguente:

71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters

Vedi anche

Supporto matematico e a virgola mobile
I/O di flusso
impostazioni locali
printf, _printf_l, wprintf_wprintf_l
scanf, _scanf_l, wscanf_wscanf_l
scanf_s, _scanf_s_l, wscanf_s_wscanf_s_l
vscanf, vwscanf