Sintassi della specifica del formato: printf
e wprintf
funzioni
Le diverse funzioni printf
e wprintf
accettano una stringa di formato e argomenti facoltativi e producono una sequenza di caratteri formattati per l'output. La stringa di formato contiene zero o più direttive, che sono caratteri letterali per l'output o specifiche di conversione codificate che descrivono come formattare un argomento nell'output. Questo articolo descrive la sintassi usata per codificare le specifiche di conversione nella stringa di formato. Per l'elenco di queste funzioni, vedere I/O di flusso.
Una specifica di conversione è costituita da campi obbligatori e facoltativi nel seguente formato:
%[flag][larghezza][.precisione][dimensione]tipo
Ogni campo della specifica di conversione è un carattere o un numero che indica un particolare identificatore di conversione o opzione di formato. Il campo obbligatorio tipo specifica il tipo di conversione da applicare a un argomento. I flag facoltativi, la larghezza e i campi di precisione controllano altri aspetti del formato, ad esempio spazi iniziali o zeri, giustificazione e precisione visualizzata. Il campo dimensione specifica la dimensione dell'argomento usato e convertito.
Una specifica di conversione semplice contiene solo il segno di percentuale e un carattere tipo. Ad esempio, %s
specifica una conversione di stringhe. Per stampare un carattere di segno di percentuale, usare %%
. Se un segno di percentuale è seguito da un carattere che non ha alcun significato come campo di formato, viene chiamato il gestore di parametro non valido. Per altre informazioni, vedere Convalida dei parametri.
Importante
Per motivi di sicurezza e stabilità, assicurarsi che le stringhe di specifica di conversione del formato non siano definite dall'utente finale. Ad esempio, si consideri un programma che richiede all'utente di inserire un nome e archivia l'input in una variabile di stringa denominata user_name
. Per stampare user_name
, non eseguire mai questa operazione:
printf( user_name ); /* Danger! If user_name contains "%s", program will crash */
Al contrario, eseguire questa operazione:
printf( "%s", user_name );
Nota
In Visual Studio 2015 Le printf
funzioni e scanf
la famiglia di funzioni sono state dichiarate come inline
e spostate nelle <stdio.h>
intestazioni e <conio.h>
. Se si esegue la migrazione di codice meno recente, è possibile che vengano visualizzati LNK2019 in relazione a queste funzioni. Per altre informazioni, vedere Cronologia delle modifiche di Visual C++ 2003 - 2015.
Identificatore di conversione tipo
Il carattere identificatore di conversione tipo specifica se l'argomento corrispondente deve essere interpretato come un carattere, una stringa, un puntatore, un numero intero o un numero a virgola mobile. Il carattere tipo è l'unico campo di specifica conversione obbligatorio e viene visualizzato dopo tutti i campi facoltativi.
Gli argomenti che seguono la stringa di formato vengono interpretati a seconda del carattere tipo corrispondente e del prefisso dimensione facoltativo. Le conversioni per i tipi di char
caratteri e wchar_t
vengono specificate usando c
o C
e le stringhe di caratteri a byte singolo e multibyte o wide vengono specificate tramite s
o S
, a seconda della funzione di formattazione in uso. Gli argomenti carattere e stringa specificati tramite e c
s
vengono interpretati come char
e char*
dalle printf
funzioni della famiglia o come wchar_t
e wchar_t*
in wprintf
base alle funzioni della famiglia. Gli argomenti carattere e stringa specificati tramite e C
S
vengono interpretati come wchar_t
e wchar_t*
dalle printf
funzioni della famiglia o come char
e char*
in wprintf
base alle funzioni della famiglia. Questo comportamento è specifico di Microsoft. Per motivi cronologici, le wprintf
funzioni usano c
e s
per fare riferimento ai wchar_t
caratteri e S
C
specificano caratteri stretti.
I tipi integer, ad short
esempio , int
long
, long long
, e le relative unsigned
varianti, vengono specificati usando d
, o
x
i
u
e .X
I tipi a virgola mobile, ad esempio , e , vengono specificati usando a
, e
f
g
F
A
E
e .G
long double
double
float
Per impostazione predefinita, a meno che non vengano modificati da un prefisso di dimensione , gli argomenti integer vengono coerciti per int
il tipo e gli argomenti a virgola mobile vengono coerciti su double
. Nei sistemi a 64 bit, un int
è un valore a 32 bit. Pertanto, i numeri interi a 64 bit verranno troncati quando vengono formattati per l'output, a meno che non venga usato un prefisso di dimensione di ll
o I64
. I tipi di puntatore specificati da p
usano le dimensioni del puntatore predefinite per la piattaforma.
Nota
Specifico di Microsoft:
Il Z
carattere di tipo e il comportamento dei c
caratteri di tipo , C
s
, e S
quando vengono usati con le printf
funzioni ewprintf
, sono estensioni Microsoft. Lo standard ISO C usa c
e s
costantemente per caratteri e stringhe strette e C
per S
caratteri e stringhe wide, in tutte le funzioni di formattazione.
Caratteri del campo tipo
Carattere tipo | Argomento | Formato di output |
---|---|---|
c |
Carattere | Una volta usato con funzioni printf , specifica un carattere a byte singolo; quando usato con funzioni wprintf , specifica un carattere wide. |
C |
Carattere | Una volta usato con funzioni printf , specifica un carattere wide; quando usato con funzioni wprintf , specifica un carattere a byte singolo. |
d |
Intero | Intero decimale con segno. |
i |
Intero | Intero decimale con segno. |
o |
Intero | Intero ottale senza segno. |
u |
Intero | Intero decimale senza segno. |
x |
Intero | Intero esadecimale senza segno; usa "abcdef ". |
X |
Intero | Intero esadecimale senza segno; usa "ABCDEF ". |
e |
A virgola mobile | Il valore con segno con il formato [- ]d.dddde [- + |]dd[d], dove d è una cifra decimale, dddd è una o più cifre decimali a seconda della precisione specificata, o sei per impostazione predefinita, e dd[d] è di due o tre cifre decimali a seconda del formato di output e delle dimensioni dell'esponente. |
E |
A virgola mobile | Identico al formato, ad eccezione del e fatto che E anziché e introdurre l'esponente. |
f |
A virgola mobile | Valore con segno con il formato [- ]dddd. dddd, dove dddd è una o più cifre decimali. Il numero di cifre prima del separatore decimale dipende dalla grandezza del numero, mentre il numero di cifre dopo il separatore decimale dipende dalla precisione richiesta o corrisponde a sei per impostazione predefinita. |
F |
A virgola mobile | Identico al formato, ad eccezione del f fatto che l'output infinito e NaN è in maiuscolo. |
g |
A virgola mobile | I valori con segno vengono visualizzati in f formato o e , a meno che sia più compatto per il valore e la precisione specificati. Il e formato viene utilizzato solo quando l'esponente del valore è minore di -4 o maggiore o uguale all'argomento precisione. Gli zeri finali vengono troncati e il separatore decimale viene visualizzato solo se uno o più cifre lo seguono. |
G |
A virgola mobile | Identico al formato, ad eccezione del g fatto che E , anziché e , introduce l'esponente (se appropriato). |
a |
A virgola mobile | Valore a virgola mobile esadecimale con precisione doppia con segno [- ]0x h.hhhhp [+ - |]dd, dove h.hhhhh sono le cifre esadecimali (usando lettere minuscole) della mantissa e dd sono una o più cifre per l'esponente. La precisione indica il numero di cifre dopo il punto. |
A |
A virgola mobile | Valore a virgola mobile esadecimale con precisione doppia con segno [- ]0X h.hhhhP [+ - |]dd, dove h.hhhhh sono le cifre esadecimali (utilizzando lettere maiuscole) della mantissa e dd sono una o più cifre per l'esponente. La precisione indica il numero di cifre dopo il punto. |
n |
Puntatore a intero | Numero di caratteri che viene scritto correttamente fino al flusso o nel buffer. Questo valore viene archiviato nel valore intero in cui l'indirizzo viene fornito come argomento. Le dimensioni del numero intero al quale si fa riferimento possono essere controllate da un prefisso di indicazione delle dimensioni dell'argomento. L'identificatore n è disattivato per impostazione predefinita. Per informazioni vedere l'importante nota sulla sicurezza. |
p |
Tipo di puntatore | Visualizzare l'argomento come indirizzo in cifre esadecimali. |
s |
String | Una volta usato con funzioni printf , specifica una stringa di caratteri a byte singolo o multibyte; una volta usato con le funzioni wprintf , specifica una stringa di carattere wide. I caratteri vengono visualizzati fino al primo carattere Null o fino a quando non viene raggiunto il valore precisione. |
S |
String | Una volta usato con funzioni printf , specifica una stringa di caratteri wide; una volta usato con le funzioni wprintf , specifica una stringa di caratteri a un byte singolo o multibyte. I caratteri vengono visualizzati fino al primo carattere Null o fino a quando non viene raggiunto il valore precisione. |
Z |
Struttura ANSI_STRING o UNICODE_STRING |
VS 2013 e versioni precedenti Quando l'indirizzo di una ANSI_STRING struttura o UNICODE_STRING viene passato come argomento, visualizzare la stringa contenuta nel buffer a cui punta il Buffer campo della struttura. Usare un prefisso del modificatore di dimensioni di w per specificare un UNICODE_STRING argomento, %wZ ad esempio . Il campo Length della struttura deve essere impostato sulla lunghezza, espressa in byte, della stringa. Il campo MaximumLength della struttura deve essere impostato sulla lunghezza, espressa in byte, del buffer.Universal C Runtime (UCRT) Esiste un problema noto in UCRT attualmente mantenuto per la compatibilità. Analogamente all'identificatore, l'identificatore senza un prefisso del modificatore di dimensioni fa riferimento a quando UNICODE_STRING si usa una funzione di stampa stretta (ad esempio ) e un ANSI_STRING quando si usa una funzione di stampa wide (ad esempio wprintf printf ).S Z Z Anziché , usare hZ per specificare un oggetto ANSI_STRING . wZ (o lZ ) può comunque essere usato per specificare un oggetto UNICODE_STRING . In genere, il Z carattere di tipo viene usato solo nelle funzioni di debug del driver che usano una specifica di conversione, ad esempio dbgPrint e kdPrint . |
In Visual Studio 2015 e versioni successive, se l'argomento che corrisponde a un identificatore di conversione a virgola mobile (a
, A
, f
e
F
E
, g
G
) è infinito, indefinito o NaN, l'output formattato è conforme allo standard C99. Questa tabella elenca l'output formattato:
Valore | Output |
---|---|
Infinito | inf |
NaN non interattivo | nan |
Segnalazione NaN | nan(snan) |
NaN indefinito | nan(ind) |
Una di queste stringhe può essere preceduta da un segno. Se un carattere identificatore di conversione tipo a virgola mobile è una lettera maiuscola, anche l'output viene formattato in lettere maiuscole. Ad esempio, se l'identificatore di formato è %F
anziché %f
, un infinity viene formattato come INF
anziché come inf
. Anche le funzioni scanf
possono analizzare queste stringhe, pertanto questi valori possono completare un round trip tra le funzioni printf
e scanf
.
Prima di Visual Studio 2015, la libreria CRT usava un formato diverso, non standard per l'output di valori infinite, indefinite e NaN:
Valore | Output |
---|---|
+ Infinito | 1.#INF cifre casuali |
-Infinità | -1.#INF cifre casuali |
Non definito (stesso valore di NaN non interattivo) | cifre .#IND casuali cifre |
NaN | cifre .#NAN casuali cifre |
Una di queste stringhe può essere stata preceduta da un segno e potrebbe essere stata formattata in modo diverso a seconda della larghezza e della precisione del campo, talvolta con effetti insoliti. Ad esempio, printf("%.2f\n", INFINITY)
stampa 1.#J
perché il #INF verrebbe "arrotondato" a due cifre di precisione.
Nota
Se l'argomento corrispondente a %s
o %S
o il campo Buffer
dell'argomento corrispondente a %Z
è un puntatore null, viene visualizzato "(null)".
Nota
In tutti i formati esponenziali, il numero minimo di cifre dell'esponente da visualizzare è due; tre cifre vengono usate solo in caso di necessità. Usando la _set_output_format
funzione , è possibile impostare il numero di cifre visualizzate su tre per garantire la compatibilità con le versioni precedenti con il codice scritto per Visual Studio 2013 e versioni precedenti.
Importante
Poiché il %n
formato è intrinsecamente non sicuro, è disabilitato per impostazione predefinita. Se %n
viene rilevato in una stringa di formato, viene richiamato il gestore di parametri non validi, come descritto in Convalida dei parametri. Per abilitare il %n
supporto, vedere _set_printf_count_output
.
Direttive flag
Il primo campo facoltativo in una specifica di conversione contiene direttive flag. Questo campo contiene zero o più caratteri flag che specificano la giustificazione dell'output e controllano l'output di segni, spazi vuoti, zeri iniziali, punti decimali e prefissi ottali ed esadecimali. In una specifica di conversione possono apparire più direttive flag e i caratteri flag possono essere visualizzati in qualsiasi ordine.
Caratteri flag
Flag | Significato | Predefiniti |
---|---|---|
- |
Allinea a sinistra il risultato entro la larghezza del campo specificata. | Allinea a destra. |
+ |
Usare un segno (+ o -) per anteporre il valore di output se è di un tipo firmato. | Il segno viene visualizzato solo per i valori con segno negativo (-). |
0 |
Se la larghezza è preceduta da 0 , gli zeri iniziali vengono aggiunti finché non viene raggiunta la larghezza minima. Se entrambi 0 e - vengono visualizzati, l'oggetto 0 viene ignorato. Se 0 viene specificato per un formato integer (i , u , x X , o d ) ed è presente anche una specifica di precisione, ad esempio, %04.d viene 0 ignorato. Se 0 viene specificato per il formato a a virgola mobile o A , gli zeri iniziali vengono anteporti alla mantissa, dopo il 0x prefisso o 0X . |
Nessun riempimento. |
blank (' ') | Usare un valore vuoto per anteporre il valore di output se è firmato e positivo. Lo spazio viene ignorato se appaiono sia il flag blank sia il flag +. | Non viene visualizzato alcuno spazio. |
# |
Quando viene usato con il o formato , x o X , il # flag usa 0 rispettivamente , 0x o , per 0X anteporre qualsiasi valore di output diverso da zero. |
Non viene visualizzato alcun prefisso. |
Quando viene usato con il e formato , E , f , F , a o A , il # flag impone al valore di output di contenere un separatore decimale. |
Il separatore decimale viene visualizzato solo se è seguito da cifre. | |
Quando viene usato con il g formato o G , il # flag forza il valore di output a contenere un separatore decimale e impedisce il troncamento degli zeri finali.Ignorato quando viene usato con c , i d , , u o s . |
Il separatore decimale viene visualizzato solo se è seguito da cifre. Gli zeri finali vengono troncati. |
Specifica della larghezza
In una specifica di conversione, il campo facoltativo di specifica della larghezza viene visualizzato dopo qualsiasi carattere flag. L'argomento width
è un numero intero decimale non negativo che controlla il numero minimo di caratteri restituiti. Se il numero di caratteri nel valore di output è inferiore alla larghezza specificata, vengono aggiunti spazi a sinistra o a destra dei valori, a seconda che sia specificato o meno il flag di allineamento a sinistra (-
), fino a raggiungere la larghezza minima. Se width
è preceduto da 0, gli zeri iniziali vengono aggiunti a conversioni intere o a virgola mobile finché non viene raggiunta la larghezza minima, tranne quando la conversione è in un infinito o NaN
.
La specifica della larghezza non provoca mai il troncamento di un valore. Se il numero di caratteri nel valore di output è maggiore della larghezza specificata o se width
non viene specificato, vengono restituiti tutti i caratteri del valore, soggetti alla specifica di precisione.
Se la specifica della larghezza è un asterisco (*
), il valore è fornito da un argomento int
dall'elenco degli argomenti. L'argomento width
deve precedere il valore formattato nell'elenco di argomenti, come illustrato in questo esempio:
printf("%0*d", 5, 3); /* 00003 is output */
Un valore mancante o piccolo width
in una specifica di conversione non causa il troncamento di un valore di output. Se il risultato di una conversione è più ampio del width
valore, il campo si espande per contenere il risultato della conversione.
Specifica della precisione
In una specifica di conversione, il terzo campo facoltativo è la specifica di precisione. È costituito da un punto (.
) seguito da un numero intero decimale non negativo che, a seconda del tipo di conversione, specifica il numero di caratteri stringa, il numero di posizioni decimali o il numero di cifre significative da restituire.
A differenza della specifica della larghezza, la specifica della precisione può causare il troncamento del valore di output o l'arrotondamento di un valore a virgola mobile. Se precision
viene specificato come 0 e il valore da convertire è 0, il risultato non restituisce alcun output di caratteri, come illustrato in questo esempio:
printf( "%.0d", 0 ); /* No characters output */
Se la specifica della precisione è un asterisco (*
), il valore viene specificato da un argomento int
dell'elenco degli argomenti. Nell'elenco degli argomenti, l'argomento precision
deve precedere il valore da formattare, come illustrato nel seguente esempio:
printf( "%.*f", 3, 3.14159265 ); /* 3.142 output */
Il type
carattere determina l'interpretazione di precision
o la precisione predefinita quando precision
viene omesso, come illustrato nella tabella seguente.
Impatto dei valori di precisione sul tipo
Type | Significato | Predefiniti |
---|---|---|
a , A |
La precisione indica il numero di cifre dopo il punto. | La precisione predefinita è 13. Se la precisione è 0 non viene stampato alcun separatore decimale, a meno che non venga usato il flag # . |
c , C |
La precisione non ha alcun effetto. | Viene stampato il carattere. |
d , i , o , u , x X |
La precisione specifica il numero minimo di cifre da stampare. Se il numero di cifre nell'argomento è minore di precisione, il valore di output viene riempito a sinistra con zeri. Il valore non viene troncato quando il numero di cifre supera la precisione. | La precisione predefinita è 1. |
e , E |
La precisione specifica il numero di cifre da stampare dopo il separatore decimale. L'ultima cifra stampata viene arrotondata. | La precisione predefinita è 6. Se la precisione è 0 o il punto (. ) viene visualizzato senza un numero successivo, non viene stampato alcun separatore decimale. |
f , F |
Il valore di precisione specifica il numero di cifre dopo il separatore decimale. Se viene visualizzato un separatore decimale, prima di esso viene visualizzata almeno una cifra. Il valore viene arrotondato al numero di cifre appropriato. | La precisione predefinita è 6. Se la precisione è 0 o se il punto (. ) viene visualizzato senza un numero successivo, non viene stampato alcun separatore decimale. |
g , G |
La precisione specifica il numero massimo di cifre significative da stampare. | Vengono stampate sei cifre significative e gli eventuali zeri finali vengono troncati. |
s , S |
La precisione specifica il numero massimo di caratteri da stampare. I caratteri in eccesso rispetto al valore precisione non vengono stampati. | I caratteri vengono stampati fino a quando non viene trovato un carattere Null. |
Specifica delle dimensioni dell'argomento
In una specifica di conversione il campo dimensione è un modificatore della lunghezza argomento per l'identificatore di conversione tipo. Il campo size prefisssi al campo tipo,hh
, h
, j
, l
(L minuscolo), L
, t
ll
w
, z
( I
maiuscolo i), I32
e , specificare I64
le "dimensioni" dell'argomento corrispondente, long o short, a 32 bit o a 64 bit, carattere a byte singolo o carattere wide, a seconda dell'identificatore di conversione modificato. Questi prefissi di dimensioni vengono usati con i caratteri tipo nei gruppi di funzioni printf
e wprintf
per specificare l'interpretazione delle lunghezze degli argomenti, come mostrato nella tabella seguente. Il campo dimensione è facoltativo per alcuni tipi di argomento. Quando non viene specificato alcun prefisso, il formattatore usa argomenti di tipo Integer, ad esempio char
, short
, int
, long
firmati o non firmati, e tipi di enumerazione, ad esempio i tipi int
a 32 bit e gli argomenti a virgola mobile float
, double
, e long double
vengono usati come tipi double
a 64 bit. Questo comportamento corrisponde alle regole di promozione degli argomenti predefinite per gli elenchi di argomenti variabili. Per altre informazioni sull'innalzamento di livello degli argomenti, vedere Puntini di sospensione e argomenti predefiniti nelle espressioni di postfissi. Nei sistemi a 32 bit e a 64 bit, la specifica di conversione di un argomento integer a 64 bit deve includere un prefisso di dimensione pari ll
a o I64
. In caso contrario, il comportamento del formattatore non sarà definito.
Alcuni tipi corrispondono a dimensioni diverse le codice a 32 bit e a 64 bit. Ad esempio, size_t
ha una lunghezza pari a 32 bit nel codice compilato per x86 e a 64 bit nel codice compilato per x64. Per creare codice di formattazione indipendente dalla piattaforma per tipi a larghezza variabile, è possibile usare un modificatore di dimensioni per argomenti a larghezza variabile. Usare invece un modificatore di dimensioni degli argomenti a 64 bit e alzare in modo esplicito il tipo di argomento a larghezza variabile a 64 bit. Il modificatore di dimensioni dell'argomento specifico I
di Microsoft (i maiuscolo) gestisce gli argomenti integer a larghezza variabile, ma è consigliabile modificare i modificatori specifici del tipo j
, t
e z
per la portabilità.
Prefissi di dimensioni per gli identificatori di formato printf e wprintf
Per specificare | Prefisso da usare | Con identificatore del tipo |
---|---|---|
char unsigned char |
hh |
d , i , o , u , x o X |
short int short unsigned int |
h |
d , i , o , u , x o X |
__int32 unsigned __int32 |
I32 |
d , i , o , u , x o X |
__int64 unsigned __int64 |
I64 |
d , i , o , u , x o X |
intmax_t uintmax_t |
j oppure I64 |
d , i , o , u , x o X |
long double |
l (L minuscolo) o L |
a , A , e , E , f , F , g o G |
long int long unsigned int |
l (L minuscola) |
d , i , o , u , x o X |
long long int unsigned long long int |
ll (LL minuscolo) |
d , i , o , u , x o X |
ptrdiff_t |
t o I (i maiuscolo) |
d , i , o , u , x o X |
size_t |
z o I (i maiuscolo) |
d , i , o , u , x o X |
Carattere a byte singolo | h |
c oppure C |
Carattere wide | l (L minuscolo) o w |
c oppure C |
Stringa con caratteri a byte singolo | h |
s , S o Z |
Stringa di caratteri wide | l (L minuscolo) o w |
s , S o Z |
I tipi ptrdiff_t
e size_t
sono __int32
o unsigned __int32
nelle piattaforme a 32 bit e __int64
o unsigned __int64
nelle piattaforme a 64 bit. I I
prefissi (i maiuscoli), j
, t
e z
accettano la larghezza dell'argomento corretta per la piattaforma.
In Visual C++, anche se long double
è un tipo distinto, ha la stessa rappresentazione interna di double
.
Un hc
identificatore di tipo o hC
è sinonimo di c
funzioni printf
e con C
in wprintf
funzioni. Un lc
identificatore di tipo , lC
wc
, o wC
è sinonimo di C
nelle printf
funzioni e con c
nelle wprintf
funzioni. Un hs
identificatore di tipo o hS
è sinonimo di s
funzioni printf
e con S
in wprintf
funzioni. Un ls
identificatore di tipo , lS
ws
, o wS
è sinonimo di S
nelle printf
funzioni e con s
in wprintf
funzioni.
Nota
Specifico di Microsoft:
I I
prefissi del modificatore (i maiuscolo), I32
, I64
e w
della dimensione dell'argomento sono estensioni Microsoft e non sono compatibili con ISO C. Il h
prefisso quando viene usato con i dati di tipo char
e il l
prefisso (L minuscolo) quando viene usato con i dati di tipo double
sono estensioni Microsoft.
Vedi anche
printf
, _printf_l
, wprintf
_wprintf_l
printf_s
, _printf_s_l
, wprintf_s
_wprintf_s_l
printf_p
Parametri posizionali