scanf
specifica della larghezza
Le informazioni si applicano all’interpretazione di stringhe di formato nella famiglia di funzioni scanf
, incluse le versioni protette, quali scanf_s
. Queste funzioni presumono normalmente che il flusso di input sia suddiviso in una sequenza di token. I token sono separati da spazi vuoti (spazio, tabulazione o nuova riga) o per i 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, è possibile utilizzare la specifica della larghezza per fare in modo di interrompere l'analisi dell'input prima della fine naturale di un token.
La width
specifica è costituita da caratteri tra l'identificatore %
di campo e il tipo, che può includere un numero intero positivo denominato width
campo e uno o più caratteri che indicano le dimensioni del campo, che possono essere considerati anche modificatori del tipo del campo, ad esempio un'indicazione del fatto che il tipo integer è short
o long
. Tali caratteri vengono definiti prefisso di dimensione.
Campo width
Il width
campo è un numero intero decimale positivo che controlla il numero massimo di caratteri da leggere per tale campo. Non più di width
caratteri vengono convertiti e archiviati nell'oggetto corrispondente argument
. È possibile leggere un numero minore di width
caratteri se si raggiunge un carattere di spazio vuoto o un carattere che non può essere convertito in base al formato width
specificato.
La specifica della larghezza è separata e distinta dall'argomento dimensioni del buffer richiesto dalle versioni sicure di queste funzioni , ad esempio , scanf_s
wscanf_s
e così via. Nell'esempio seguente, la specifica della larghezza è pari a 20, il che significa che fino a un massimo di 20 caratteri devono essere letti dal flusso di input. La lunghezza del buffer è 21, che include spazio per i 20 caratteri possibili e il terminatore null:
char str[21];
scanf_s("%20s", str, 21);
Se il width
campo non viene usato, scanf_s
tenta di leggere l'intero token nella stringa. Se le dimensioni specificate non sono sufficienti per contenere l'intero token, non viene scritto nulla nella stringa di destinazione. Se il width
campo viene specificato, i primi width
caratteri del token vengono scritti nella stringa di destinazione, insieme al carattere di terminazione Null.
Prefisso delle dimensioni
I prefissi facoltativi h
, hh
, l
ll
, , I64
e L
indicano le dimensioni del argument
carattere (carattere long o short, a byte singolo o wide, a seconda del carattere di tipo modificato). Questi caratteri di specifica del 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 I64
del tipo è un'estensione Microsoft e non è compatibile con C Standard. I caratteri di tipo e i relativi significati sono descritti nella tabella "Caratteri di tipo per le funzioni scanf" in scanf
caratteri di campo di tipo.
Nota
I h
prefissi , l
e L
sono estensioni Microsoft quando vengono usate con i dati di tipo char
.
Prefissi di dimensioni per scanf
gli identificatori di tipo formato e wscanf
Per specificare | Prefisso da usare | Con identificatore del tipo |
---|---|---|
double |
l |
e , E , f , g o G |
long double (uguale a 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 |
char |
hh |
d , i , o , x o X |
unsigned char |
hh |
u |
int64 |
I64 |
d , i , o , u , x o X |
Carattere a byte singolo con scanf |
h |
c oppure C |
Carattere a byte singolo con wscanf |
h |
c oppure C |
Carattere wide con scanf |
l |
c oppure C |
Carattere wide con wscanf |
l |
c oppure C |
Stringa di caratteri a byte singolo con scanf |
h |
s oppure S |
Stringa di caratteri a byte singolo con wscanf |
h |
s oppure S |
Stringa di caratteri wide con scanf |
l |
s oppure S |
Stringa di caratteri wide con wscanf |
l |
s oppure S |
Gli esempi seguenti usano h
e l
con scanf_s
funzioni e wscanf_s
funzioni:
scanf_s("%ls", &x, 2); // Read a wide-character string
wscanf_s(L"%hC", &x, 2); // Read a single-byte character
Se si utilizza una funzione non protetta nella famiglia scanf
, omettere il parametro di dimensione che indica la lunghezza del buffer dell'argomento precedente.
Lettura di stringhe non recapitate
Per leggere stringhe non delimitate da spazi vuoti, è possibile sostituire un set di caratteri tra parentesi quadre ([ ]
) per il s
tipo (stringa). Il set di caratteri tra parentesi quadre viene definito stringa di controllo. Il campo di input corrispondente viene letto fino al primo carattere che non viene visualizzato nella stringa di controllo. Se il primo carattere nel set è un accento circonflesso (^
), l'effetto è invertito: il campo di input viene letto fino al primo carattere visualizzato nella parte rimanente del set di caratteri.
Sia %[a-z]
che %[z-a]
vengono interpretati come equivalenti a %[abcde...z]
. Si tratta di un'estensione di funzione comune scanf
, ma non è richiesta da Standard C.
Lettura di stringhe senza terminazione
Per archiviare una stringa senza archiviare un carattere Null di terminazione ('\0'), usare la specifica %Nc
, dove N è un numero intero decimale. In questo caso, il c
carattere di tipo indica che l'argomento è un puntatore a una matrice di caratteri. I successivi N caratteri vengono letti dal flusso di input nella posizione specificata e non viene aggiunto alcun carattere Null ('\0'). Se N non è specificato, il valore predefinito è 1.
Quando scanf
si interrompe la lettura di un campo
La funzione scanf
esegue l'analisi di ogni campo di input di un carattere. Può smettere di leggere un particolare campo di input prima di raggiungere un carattere di spazio per uno dei diversi motivi:
La larghezza specificata è stata raggiunta.
Il carattere successivo non può essere convertito come specificato.
Il carattere successivo è in conflitto con un carattere nella stringa di controllo che deve corrispondere.
Il carattere successivo non viene visualizzato in un set di caratteri specificato.
Per qualsiasi motivo, quando la funzione scanf
interrompe la lettura di un campo di input, il campo di input successivo viene considerato per iniziare con il primo carattere da leggere. Il carattere in conflitto, se presente, viene considerato non letto. Si tratta del primo carattere del campo di input successivo o del primo carattere nelle operazioni di lettura successive nel flusso di input.
Vedi anche
scanf
, _scanf_l
, wscanf
_wscanf_l
scanf_s
, _scanf_s_l
, wscanf_s
_wscanf_s_l
Campi di specifica del formato: scanf
e wscanf
funzioni
scanf
caratteri di campo di tipo