sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l

Legge i dati formattati da una stringa. Queste versioni di sscanf, _sscanf_lswscanf, , _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_errliste _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_lwscanf_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