Condividi tramite


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_swscanf_se 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, lll, , I64e 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 hprefissi , le 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