scanf_s
, _scanf_s_l
, wscanf_s
_wscanf_s_l
Legge i dati formattati dal flusso di input standard. Queste versioni di scanf
, _scanf_l
wscanf
, , _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_errlist
e _sys_nerr
.
Osservazioni:
La scanf_s
funzione legge i dati dal flusso di input standard, stdin
e 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 c
parametri del S
s
set []
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
, stdout
e 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