Specifica della larghezza per scanf
Queste informazioni si riferiscono all'interpretazione delle stringhe di formato della famiglia di funzioni scanf, incluse le versioni sicure come scanf_s. Queste funzioni in genere assumono che il flusso di input sia suddiviso in una sequenza di token. I token sono separati da uno spazio vuoto (spazio, tabulazione, o nuova riga) o, nel caso di tipi numerici, dalla fine naturale di un tipo di dati numerico come indicato dal primo carattere che non può essere convertito in testo numerico. Tuttavia, la specifica della dimensione può essere utilizzata per forzare l'arresto dell'analisi dell'input prima della fine naturale di un token.
La specifica di width è costituita dai caratteri compresi tra % e l'identificatore di campo del tipo, che possono includere un intero positivo denominato campo width e uno o più caratteri che indicano la dimensione del campo, il quale può anche essere considerato come modificatore del tipo del campo, come un'indicazione se il tipo intero sia short o long. Questi caratteri vengono definiti come prefisso della dimensione.
Il campo Width
Il campowidth è un intero decimale positivo che controlla il numero massimo di caratteri da leggere per tale campo. Non più di width caratteri vengono convertiti e memorizzati nel corrispondente argument. Potrebbero essere letti meno di width se si presenta uno spazio vuoto (spazio, tabulazione, o nuova riga) o un carattere che non può essere convertito in base al formato specificato prima che width venga raggiunto.
La specifica della dimensione è separata e distinta dall'argomento della dimensione del buffer richiesto dalle versioni sicure di queste funzioni (ovvero, scanf_s, wscanf_s, e così via). Nell'esempio seguente, la specifica della dimensione è 20, che indica che devono essere letti un massimo di 20 caratteri dal flusso di input. La lunghezza del buffer è 21, che include lo spazio per i 20 possibili caratteri più il terminatore null:
char str[21];
scanf_s("%20s", str, 21);
Se il campo width non viene utilizzato, scanf_s tenterà di leggere l'intero token nella stringa. Se la dimensione specificata non è grande a sufficienza per memorizzare l'intero token, non verrà scritto nulla nella stringa di destinazione. Se il campo width viene specificato, allora i primi width caratteri del token verranno scritti nella stringa di destinazione con il carattere di terminazione null.
Il prefisso Size
I prefissi facoltativi h, l, ll, I64 e L indicano la dimensione di argument (carattere long o short, a byte singolo o carattere wide, a seconda del tipo di carattere che modificano). Questi caratteri di specifica di formato vengono utilizzati con i caratteri di tipo nelle funzioni scanf o wscanf per specificare l'interpretazione degli argomenti come illustrato nella tabella seguente. Il prefisso di tipo I64 è un'estensione Microsoft e non è compatibile con lo standard ANSI. I caratteri di tipi ed i relativi significati vengono descritti nella tabella "Caratteri di tipi per le funzioni scanf" in Caratteri di campo di tipo per scanf.
Nota
I prefissi h, l e L sono estensioni Microsoft quando utilizzati con i dati di tipo char.
Prefissi Size per gli identificatori di tipo di formato di scanf e wscanf
Per specificare |
Utilizzare il prefisso |
Con l'identificatore del tipo |
---|---|---|
double |
l |
e, E, f, g, o G |
long double (come per double) |
L |
e, E, f, g, o G |
long int |
l |
d, i, o, x, o X |
long unsigned int |
l |
u |
long long |
ll |
d, i, o, x, o X |
short int |
h |
d, i, o, x, o X |
short unsigned int |
h |
u |
__int64 |
I64 |
d, i, o, u, x, o X |
Carattere a byte singolo con scanf |
h |
c o C |
Carattere a byte singolo con wscanf |
h |
c o C |
Carattere wide con scanf |
l |
c o C |
Carattere wide con wscanf |
l |
c, o C |
Stringa di caratteri a byte singolo con scanf |
h |
s o S |
Stringa di caratteri a byte singolo con wscanf |
h |
s o S |
Stringa a caratteri wide con scanf |
l |
s o S |
Stringa a caratteri wide con wscanf |
l |
s o S |
Gli esempi seguenti utilizzano h e l con le funzioni scanf_s e wscanf_s:
scanf_s( "%ls", &x, 2 ); // Read a wide-character string
wscanf_s( "%hC",&x, 2 ); // Read a single-byte character
Se si utilizza una funzione non sicura della famiglia scanf, omettere il parametro size che indica la dimensione del buffer dell'argomento precedente.
Leggere stringhe non limitate
Per leggere stringhe non delimitate da caratteri di spaziatura vuoti, può essere sostituito un set di caratteri tra parentesi ([ ]) con il carattere di tipo s (string). Il set di caratteri tra parentesi viene definito come una stringa di controllo. Il campo di input corrispondente viene letto fino al primo carattere che non è presente nella stringa del controllo. Se il primo carattere nell'inseme è un accento circonflesso (^), l'effetto viene ribaltato: Il campo di input viene letto fino al primo carattere presente nel resto dell'insieme di caratteri.
Si noti che %[a-z] e %[z-a] vengono interpretati come equivalenti a %[abcde...z]. Questa è un'estensione comune della funzione scanf, ma si noti che lo standard ANSI non la richiede.
Leggere stringhe senza terminazione
Per memorizzare una stringa senza salvare un carattere di terminazione null ('\0'), utilizzare la specifica %nc dove n rappresenta un valore intero decimale. In questo caso, il carattere di tipo c indica che l'argomento è un puntatore ad un array di caratteri. I seguenti n caratteri vengono letti dal flusso di input nella posizione specificata e non viene aggiunto nessun carattere null ('\0'). Se n non viene specificata, il valore predefinito è 1.
Quando scanf smette di leggere un campo
La funzione scanf analizza ogni campo di input, carattere per carattere. Può smettere di leggere un campo di input specifico prima di raggiungere un carattere di spaziatura per diversi motivi:
È stata raggiunta la larghezza specificata.
Il carattere successivo non può essere convertito come specificato.
Il carattere successivo è in conflitto con un carattere nella stringa di controllo a cui si suppone debba corrispondere.
Il carattere successivo non è presente in un set di caratteri specificato.
Per qualsiasi motivo, quando la funzione di scanf smette di leggere un campo di input, si considera come inizio del campo di input successivo il primo carattere non letto. Il carattere in conflitto, se presente, viene considerato come non letto ed è il primo carattere del campo di input successivo o il primo carattere nelle operazioni di lettura successive nel flusso di input.
Vedere anche
Riferimenti
scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l