Specifica della larghezza per scanfscanf Width Specification

Le informazioni si applicano all’interpretazione di stringhe di formato nella famiglia di funzioni scanf, incluse le versioni protette, quali scanf_s.This information applies to the interpretation of format strings in the scanf family of functions, including the secure versions such as scanf_s. Queste funzioni presumono normalmente che il flusso di input sia suddiviso in una sequenza di token.These functions normally assume the input stream is divided into a sequence of tokens. I token sono separati da spazi vuoti (spazi, tabulazioni o caratteri di nuova riga) o nel caso dei tipi numerici, dalla fine naturale di un tipo di dati numerici secondo quanto indicato dal primo carattere che non può essere convertito in testo numerico.Tokens are separated by whitespace (space, tab, or newline), or in the case of numerical types, by the natural end of a numerical data type as indicated by the first character that cannot be converted into numerical text. Tuttavia, è possibile utilizzare la specifica della larghezza per fare in modo di interrompere l'analisi dell'input prima della fine naturale di un token.However, the width specification may be used to cause parsing of the input to stop before the natural end of a token.

La specifica larghezza è costituita da caratteri inclusi tra l’identificatore % e l'identificatore del campo di tipo, che può includere un intero positivo denominato campo larghezza e uno o più caratteri che indicano la dimensione del campo, i quali possono essere anche considerati come modificatori del tipo di campo, ad esempio un valore che indica se il tipo integer è short o long.The width specification consists of characters between the % and the type field specifier, which may include a positive integer called the width field and one or more characters indicating the size of the field, which may also be considered as modifiers of the type of the field, such as an indication of whether the integer type is short or long. Tali caratteri vengono definiti prefisso di dimensione.Such characters are referred to as the size prefix.

Il campo della larghezzaThe Width Field

Il campo larghezza è un intero positivo decimale che controlla il numero massimo di caratteri da leggere per il campo specifico.The width field is a positive decimal integer controlling the maximum number of characters to be read for that field. Un numero di caratteri non superiore al valore di larghezza viene convertito e archiviato nell'argument corrispondente.No more than width characters are converted and stored at the corresponding argument. Un numero di caratteri inferiori al valore di larghezza può essere letto se uno spazio vuoto (spazio, tabulazione o carattere di nuova riga) o un carattere che non può essere convertito in base al formato specificato si presenta prima che venga raggiunto il valore della larghezza.Fewer than width characters may be read if a whitespace character (space, tab, or newline) or a character that cannot be converted according to the given format occurs before width is reached.

La specifica della larghezza è separata e distinta dall'argomento relativo alle dimensioni del buffer richiesto dalle versioni sicure di queste funzioni (ad esempio, scanf_s, wscanf_s e così via).The width specification is separate and distinct from the buffer size argument required by the secure versions of these functions (i.e., scanf_s, wscanf_s, etc.). 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.In the following example, the width specification is 20, indicating that up to 20 characters are to be read from the input stream. La lunghezza del buffer è 21, che include spazio per i 20 caratteri possibili e il terminatore null:The buffer length is 21, which includes room for the possible 20 characters plus the null terminator:

char str[21];  
scanf_s("%20s", str, 21);  

Se il campo larghezza non viene usato, scanf_s prova a leggere l'intero token nella stringa.If the width field is not used, scanf_s will attempt to read the entire token into the string. Se la dimensione specificata non è sufficientemente grande da contenere il token intero, nulla verrà scritto nella stringa di destinazione.If the size specified is not large enough to hold the entire token, nothing will be written to the destination string. Se viene specificato il campo larghezza, i primi caratteri pari al valore di larghezza nel token verranno scritti nella stringa di destinazione insieme al carattere di terminazione Null.If the width field is specified, then the first width characters in the token will be written to the destination string along with the null terminator.

Il prefisso di dimensioneThe Size Prefix

I prefissi facoltativi h, l, ll, I64 e L indicano le dimensioni dell'argument (lungo o breve, con caratteri a un byte o caratteri wide, a seconda del carattere di tipo che modificano).The optional prefixes h, l, ll, I64, and L indicate the size of the argument (long or short, single-byte character or wide character, depending upon the type character that they modify). 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.These format-specification characters are used with type characters in scanf or wscanf functions to specify interpretation of arguments as shown in the following table. Il prefisso di tipo I64 è un'estensione Microsoft e non è compatibile con lo standard ANSI.The type prefix I64 is a Microsoft extension and is not ANSI compatible. I caratteri di tipo e i relativi significati sono descritti nella tabella "Caratteri tipo per funzioni scanf" in Caratteri di campo di tipo per scanf.The type characters and their meanings are described in the "Type Characters for scanf functions" table in scanf Type Field Characters.

Nota

I prefissi h, l e L sono estensioni Microsoft quando usate con i dati di tipo char.The h, l, and L prefixes are Microsoft extensions when used with data of type char.

Prefissi di dimensione per identificatori di tipo di formato scanf e wscanfSize Prefixes for scanf and wscanf Format-Type Specifiers

Per specificareTo specify Prefisso da usareUse prefix Con identificatore del tipoWith type specifier
doubledouble ll e, E, f, g o Ge, E, f, g, or G
long double (uguale a double)long double (same as double) LL e, E, f, g o Ge, E, f, g, or G
long intlong int ll d, i, o, x, o Xd, i, o, x, or X
long unsigned intlong unsigned int ll uu
long longlong long llll d, i, o, x, o Xd, i, o, x, or X
short int hh d, i, o, x, o Xd, i, o, x, or X
short unsigned intshort unsigned int hh uu
int64int64 I64I64 d, i, o, u, x o Xd, i, o, u, x, or X
Carattere a byte singolo con scanfSingle-byte character with scanf hh c o Cc or C
Carattere a byte singolo con wscanfSingle-byte character with wscanf hh c o Cc or C
Carattere wide con scanfWide character with scanf ll c o Cc or C
Carattere wide con wscanfWide character with wscanf ll c o Cc, or C
Stringa di caratteri a un byte con scanfSingle-byte - character string with scanf hh s o Ss or S
Stringa di caratteri a un byte con wscanfSingle-byte - character string with wscanf hh s o Ss or S
Stringa di caratteri wide con scanfWide-character string with scanf ll s o Ss or S
Stringa di caratteri wide con wscanfWide-character string with wscanf ll s o Ss or S

Gli esempi seguenti usano h e l con le funzioni scanf_s e wscanf_s:The following examples use h and l with scanf_s functions and wscanf_s functions:

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.If using an unsecure function in the scanf family, omit the size parameter indicating the buffer length of the preceding argument.

Lettura di stringhe non delimitateReading Undelimited strings

Per leggere le stringhe non delimitate da spazi vuoti, un set di caratteri tra parentesi quadre ([ ]) può essere sostituito per il carattere di tipo s (stringa).To read strings not delimited by whitespace characters, a set of characters in brackets ([ ]) can be substituted for the s (string) type character. Il set di caratteri tra parentesi quadre è considerato una stringa di controllo.The set of characters in brackets is referred to as a control string. Il campo di input corrispondente viene letto fino al primo carattere che non viene visualizzato nella stringa di controllo.The corresponding input field is read up to the first character that does not appear in the control string. 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.If the first character in the set is a caret (^), the effect is reversed: The input field is read up to the first character that does appear in the rest of the character set.

Si noti che %[a-z] e %[z-a] vengono interpretati come equivalenti a %[abcde...z].Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]. Si tratta di un comune estensione di funzione scanf, ma si noti che lo standard ANSI non lo richiede.This is a common scanf function extension, but note that the ANSI standard does not require it.

Lettura di stringhe senza terminazioneReading Unterminated strings

Per archiviare una stringa senza archiviare un carattere di terminazione Null ('\0'), usare la specifica %nc dove n è un intero decimale.To store a string without storing a terminating null character ('\0'), use the specification %nc where n is a decimal integer. In questo caso, il carattere di tipo c indica che l'argomento è un puntatore a una matrice di caratteri.In this case, the c type character indicates that the argument is a pointer to a character array. I successivi n caratteri vengono letti dal flusso di input nel percorso specificato e non viene accodato nessun carattere Null ('\0').The next n characters are read from the input stream into the specified location, and no null character ('\0') is appended. Se n non viene specificato, il valore predefinito è 1.If n is not specified, its default value is 1.

Quando scanf interrompe la lettura di un campoWhen scanf stops reading a field

La funzione scanf esegue l'analisi di ogni campo di input di un carattere.The scanf function scans each input field, character by character. Potrebbe smettere di leggere un determinato campo di input prima di raggiungere un carattere di spazio per una serie di motivi:It may stop reading a particular input field before it reaches a space character for a variety of reasons:

  • La larghezza specificata è stata raggiunta.The specified width has been reached.

  • Il carattere successivo non può essere convertito come specificato.The next character cannot be converted as specified.

  • I conflitti del carattere successivo con un carattere nella stringa di controllo con cui dovrebbe corrispondere.The next character conflicts with a character in the control string that it is supposed to match.

  • Il carattere successivo non viene visualizzato in un set di caratteri specificato.The next character fails to appear in a given character set.

    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.For whatever reason, when the scanf function stops reading an input field, the next input field is considered to begin at the first unread character. Il carattere in conflitto se è presente, viene considerato non letto ed è il primo carattere del campo di input successivo o il primo carattere nelle successive operazioni di lettura nel flusso di input.The conflicting character, if there is one, is considered unread and is the first character of the next input field or the first character in subsequent read operations on the input stream.

Vedere ancheSee Also

scanf, _scanf_l, wscanf, _wscanf_l scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l
Campi per la specifica di formato: funzioni scanf e wscanf Format Specification Fields: scanf and wscanf Functions
Caratteri di campo di tipo per scanfscanf Type Field Characters