scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

Legge i dati formattati dal flusso di input standard. Queste versioni di scanf, _scanf_lwscanf, , _wscanf_l includono miglioramenti della sicurezza, come descritto in Funzionalità di sicurezza in CRT.

Sintassi

int scanf_s(
   const char *format [,
   argument]...
);
int _scanf_s_l(
   const char *format,
   _locale_t locale [,
   argument]...
);
int wscanf_s(
   const wchar_t *format [,
   argument]...
);
int _wscanf_s_l(
   const wchar_t *format,
   _locale_t locale [,
   argument]...
);

Parametri

format
Stringa di formato controllo.

argument
Argomenti facoltativi.

locale
Impostazioni locali da usare.

Valore restituito

Restituisce il numero di campi convertiti e assegnati correttamente. Il valore restituito non include i campi letti ma non assegnati. Un valore restituito pari a 0 indica che non sono stati assegnati campi. Il valore restituito è EOF relativo a un errore o se il carattere di fine del file o il carattere di fine stringa viene trovato nel 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, scanf_s e wscanf_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 scanf_s funzione legge i dati dal flusso di input standard, stdine lo scrive in argument. Ogni argument deve essere un puntatore a un tipo di variabile che corrisponde all'identificatore di tipo in format. Se la copia avviene tra stringhe che si sovrappongono, il comportamento non è definito.

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

Le versioni di queste funzioni con suffisso _l sono identiche, ad eccezione del fatto che usano il locale parametro anziché le impostazioni locali del thread corrente.

A differenza di scanf e wscanf, scanf_s e wscanf_s richiedono di specificare le dimensioni del buffer per alcuni parametri. Specificare le dimensioni per tutti i cparametri del Ssset [] di controlli stringa , C, , o . Le dimensioni del buffer in caratteri vengono passate come un altro parametro. Segue immediatamente il puntatore al buffer o alla variabile. Ad esempio, se si legge una stringa, le dimensioni del buffer per tale stringa vengono passate come segue:

char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9

Le dimensioni del buffer includono il terminale Null. È possibile usare un campo di specifica della larghezza per assicurarsi che il token letto si adatti al buffer. Quando un token è troppo grande per adattarsi, non viene scritto nulla nel buffer, a meno che non esista una specifica di larghezza.

Nota

Il parametro di dimensione è di tipo unsigned non size_t. Usare un cast statico per convertire un valore size_t in unsigned per le configurazioni di compilazione a 64 bit.

Il parametro dimensioni buffer descrive il numero massimo di caratteri, non byte. In questo esempio la larghezza del tipo di buffer non corrisponde alla larghezza dell'identificatore di formato.

wchar_t ws[10];
wscanf_s(L"%9S", ws, (unsigned)_countof(ws));

L'identificatore S di formato significa usare la larghezza del carattere "opposta" alla larghezza predefinita supportata dalla funzione. La larghezza dei caratteri è a byte singolo, ma la funzione supporta caratteri a byte doppio. Questo esempio legge in una stringa di un massimo di nove caratteri a byte singolo e li inserisce in un buffer di caratteri a doppio byte. I caratteri vengono trattati come valori a byte singolo; i primi due caratteri vengono archiviati in ws[0], i due successivi vengono archiviati in ws[1] e così via.

Questo esempio legge un singolo carattere:

char c;
scanf_s("%c", &c, 1);

Quando vengono letti più caratteri per stringhe con terminazione non Null, i numeri interi vengono usati sia per la specifica della larghezza che per la dimensione del buffer.

char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated

Per altre informazioni, vedere scanf Specifica della larghezza.

Mapping di routine di testo generico

TCHAR.H Routine _UNICODE e _MBCS non definito _MBCS Definito _UNICODE Definito
_tscanf_s scanf_s scanf_s wscanf_s
_tscanf_s_l _scanf_s_l _scanf_s_l _wscanf_s_l

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

Requisiti

Ciclo Intestazione obbligatoria
scanf_s, _scanf_s_l <stdio.h>
wscanf_s, _wscanf_s_l <stdio.h> oppure <wchar.h>

La console non è supportata nelle app piattaforma UWP (Universal Windows Platform) (UWP). Il flusso standard gestisce stdin, stdoute stderr deve essere reindirizzato prima che le funzioni di runtime C possano usarle nelle app UWP. Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

// crt_scanf_s.c
// This program uses the scanf_s and wscanf_s functions
// to read formatted input.

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

int main( void )
{
   int      i,
            result;
   float    fp;
   char     c,
            s[80];
   wchar_t  wc,
            ws[80];

   result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
                     &wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_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 = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
                      &wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_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);
}

Questo programma produce l'output seguente quando viene fornito questo input:

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
fscanf, _fscanf_l, fwscanf, _fwscanf_l
printf, _printf_l, wprintf, _wprintf_l
sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
sscanf, _sscanf_l, swscanf, _swscanf_l