sscanf_s
, _sscanf_s_l
, swscanf_s
_swscanf_s_l
Legge i dati formattati da una stringa. Queste versioni di sscanf
, _sscanf_l
swscanf
, , _swscanf_l
includono miglioramenti della sicurezza, come descritto in Funzionalità di sicurezza in CRT.
Sintassi
int sscanf_s(
const char *buffer,
const char *format [,
argument ] ...
);
int _sscanf_s_l(
const char *buffer,
const char *format,
_locale_t locale [,
argument ] ...
);
int swscanf_s(
const wchar_t *buffer,
const wchar_t *format [,
argument ] ...
);
int _swscanf_s_l(
const wchar_t *buffer,
const wchar_t *format,
_locale_t locale [,
argument ] ...
);
Parametri
buffer
Dati archiviati
format
Stringa di controllo del formato. Per altre informazioni, vedere Formattare i campi delle specifiche: scanf
e wscanf
le funzioni.
argument
Argomenti facoltativi
locale
Impostazioni locali da usare
Valore restituito
Ognuna di queste funzioni restituisce il numero di campi che vengono convertiti e assegnati correttamente. Il valore restituito non include i campi letti ma non assegnati. Un valore restituito pari a 0 indica che nessun campo è stato assegnato. Il valore restituito è EOF
in caso di errore o se viene raggiunta la fine della stringa prima della prima conversione.
Se buffer
o format
è un NULL
puntatore, viene richiamato il gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, queste funzioni restituiscono -1 e impostano errno
su EINVAL
Per informazioni su questi e altri codici di errore, vedere errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Osservazioni:
La funzione sscanf_s
legge i dati da buffer
nella posizione specificata da ogni argument
. Gli argomenti dopo la stringa di formato specificano i puntatori alle variabili che hanno un tipo corrispondente all'identificatore di tipo in format
. Diversamente dalla versione meno sicura sscanf
, è necessario un parametro per le dimensioni del buffer quando si usano i caratteri di campo di tipo c
, C
, s
, S
o set di controllo stringa racchiusi tra []
. Le dimensioni del buffer in caratteri devono essere fornite come parametro aggiuntivo immediatamente dopo ogni parametro del buffer che lo richiede. Ad esempio, se si legge in una stringa, la dimensione del buffer per tale stringa viene passata come segue:
wchar_t ws[10];
swscanf_s(in_str, L"%9s", ws, (unsigned)_countof(ws)); // buffer size is 10, width specification is 9
La dimensione del buffer include il carattere di terminazione null. Potrebbe essere usato un campo di specifica della larghezza per assicurarsi che il token 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.
Un singolo carattere può essere letto come segue:
wchar_t wc;
swscanf_s(in_str, L"%c", &wc, 1);
Questo esempio legge un singolo carattere dalla stringa di input e quindi lo archivia in un buffer di caratteri wide. Quando si leggono più caratteri per stringhe con terminazione non Null, vengono usati interi senza segno per specificare la larghezza e le dimensioni del buffer.
char c[4];
sscanf_s(input, "%4c", &c, (unsigned)_countof(c)); // not null terminated
Per altre informazioni, vedere caratteri di campo di tipo , _scanf_s_l
wscanf_s
, _wscanf_s_l
e scanf
.scanf_s
Nota
Il parametro di dimensione è di tipo unsigned
non size_t
. Durante la compilazione per destinazioni a 64 bit, usare un cast statico per convertire i risultati di _countof
o sizeof
nelle dimensioni corrette.
L'argomento format
controlla l'interpretazione dei campi di input e ha lo stesso formato e la stessa funzione dell'argomento format
per la funzione scanf_s
. Se la copia avviene tra stringhe che si sovrappongono, il comportamento non è definito.
swscanf_s
è una versione a caratteri "wide" di sscanf_s
. Gli argomenti per swscanf_s
sono stringhe a caratteri "wide". sscanf_s
non gestisce caratteri esadecimali multibyte. swscanf_s
non gestisce caratteri esadecimali a larghezza intera Unicode o "zona di compatibilità". In caso contrario, swscanf_s
e sscanf_s
si comportano in modo identico.
Le versioni di queste funzioni con il suffisso _l
sono identiche, ad eccezione del fatto che utilizzano il parametro delle impostazioni locali passato al posto delle impostazioni locali del thread corrente.
Mapping di routine di testo generico
TCHAR.H routine |
_UNICODE e _MBCS non definito |
_MBCS definito |
_UNICODE definito |
---|---|---|---|
_stscanf_s |
sscanf_s |
sscanf_s |
swscanf_s |
_stscanf_s_l |
_sscanf_s_l |
_sscanf_s_l |
_swscanf_s_l |
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
sscanf_s , _sscanf_s_l |
<stdio.h> |
swscanf_s , _swscanf_s_l |
<stdio.h> oppure <wchar.h> |
Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
Esempio
// crt_sscanf_s.c
// This program uses sscanf_s to read data items
// from a string named tokenstring, then displays them.
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
char tokenstring[] = "15 12 14...";
char s[81];
char c;
int i;
float fp;
// Input various data from tokenstring:
// max 80 character string plus null terminator
sscanf_s( tokenstring, "%s", s, (unsigned)_countof(s) );
sscanf_s( tokenstring, "%c", &c, (unsigned)sizeof(char) );
sscanf_s( tokenstring, "%d", &i );
sscanf_s( tokenstring, "%f", &fp );
// Output the data read
printf_s( "String = %s\n", s );
printf_s( "Character = %c\n", c );
printf_s( "Integer: = %d\n", i );
printf_s( "Real: = %f\n", fp );
}
String = 15
Character = 1
Integer: = 15
Real: = 15.000000
Vedi anche
I/O di flusso
fscanf
, _fscanf_l
, fwscanf
_fwscanf_l
scanf
, _scanf_l
, wscanf
_wscanf_l
sprintf
, _sprintf_l
, swprintf
, _swprintf_l
__swprintf_l
snprintf
, _snprintf
, _snprintf_l
, _snwprintf
_snwprintf_l