Cominciamo dalla funzione "printf"

 


 

Perché una funzione di input-output del C ?  

 

La funzione printf è importante perché utilizza gli specificatori di formato, che definiscono il modo di scrivere i dati (formattazione). Tali specificatori sono usati, con le stesse regole della printf, da tutte le funzioni (anche non di input-output), che eseguono conversioni di formato sui dati

 


 

Operazioni della funzione printf

 

La funzione printf formatta e scrive una serie di caratteri e valori sul dispositivo standard di output (stdout), associato di default allo schermo del video, e restituisce al programma chiamante il numero di caratteri effettivamente scritti (oppure un numero negativo in caso di errore).
Quando si usa la funzione printf bisogna prima includere il file header <stdio.h>

 


 

Argomenti della funzione printf

 

La funzione printf riceve dal programma chiamante uno o più argomenti. Solo il primo è obbligatorio e deve essere una stringa, che si chiama control string (stringa di controllo)

 


 

Scrittura della control string sullo schermo

 

Quando printf è chiamata con un solo argomento, la control string viene trasferita sullo schermo, carattere per carattere (compresi gli spazi bianchi), salvo quando sono incontrati i seguenti caratteri particolari:

"     (termina la control string)
%     (introduce uno specificatore di formato - da non usare in questo caso)
\     (introduce una sequenza di escape)

 


 

Sequenze di escape

 

Il carattere \ (backslash) non viene trasferito sullo schermo, ma utilizzato in combinazione con i caratteri successivi (un solo carattere se si tratta di una lettera, oppure una sequenza di cifre numeriche); l'insieme viene detto: escape sequence, e viene interpretato come un unico carattere.
Le sequenze di escape sono usate tipicamente per specificare caratteri speciali che non hanno il loro equivalente stampabile (come newline, carriage return, tabulazioni, suoni ecc...), oppure caratteri, che da soli, hanno una funzione speciale, come le virgolette o lo stesso backslash

 


 

Principali sequenze di escape

 

\a suona il campanello (bell)     \b carattere backspace
\f salta pagina (form-feed)     \n va a capo (newline)
\r ritorno carrello (carriage-return)     \t tabulazione orizzontale
\\ carattere backslash     \" carattere virgolette
\nnn carattere con codice ascii nnn (tre cifre in ottale)
\nn carattere con codice ascii nn (due cifre in esadecimale)
%% carattere "%" - atipico: è introdotto da % anziché da \
\ da solo alla fine della riga = continua la control string nella riga successiva

 


 

La funzione printf con più argomenti

 

Eventuali altri argomenti successivi alla control string, nella chiamata a printf, rappresentano i dati da formattare e scrivere, e possono essere costituiti da costanti, variabili, espressioni, o altre funzioni (in questo caso in realtà l'argomento è il valore di ritorno della funzione, la quale viene eseguita prima della printf). Per il momento, dato che le variabili non sono state ancora introdotte, supponiamo che i dati siano costituiti da costanti o da espressioni fra costanti

 


 

Specificatori di formato

 

Ad ogni argomento successivo alla control string, deve corrispondere, all'interno della stessa control string e nello stesso ordine, uno specificatore di formato, costituito da un gruppo di caratteri introdotto dal carattere "%". Nella sua forma generale uno specificatore di formato ha la seguente sintassi:

%[flags][width][.precision]type

dove i termini indicati con il colore fuchsia costituiscono i campi dello specificatore (senza spazi in mezzo), e sono tutti opzionali salvo l'ultimo (type), che determina come deve essere interpretato il corrispondente argomento della printf (numero intero, numero floating, carattere, stringa ecc...). I campi opzionali controllano invece il formato di scrittura. Se sono omessi, cioè lo specificatore assume la forma minima %type, i dati sono scritti in free-format (cioè in modo da occupare lo spazio strettamente necessario). Per esempio, se a un certo punto della control string compare lo specificatore %d, significa che in quella posizione deve essere scritto, in free-format, il valore del corrispondente argomento della printf, espresso come numero intero decimale, come nel caso della seguente istruzione:
       printf("Ci sono %d iscritti a questo corso!\nTemevo fossero solo %d!",3215+1,2);
che scrive su video la frase:
       Ci sono 3216 iscritti a questo corso!
       Temevo fossero solo 2!

 


 

Principali specificatori di formato in free-format

 

In uno specificatore di formato il campo obbligatorio type può assumere uno dei seguenti valori:

u,  o,  x     valori interi assoluti, basi: decimale, ottale, esadecimale
X     come x ma con le cifre letterali maiuscole
d,  i     valori interi relativi, base decimale
f,  e     valori floating, notazione normale o esponenziale
g     come f o e (sceglie il più comodo)
E,  G     come e e g (scrive "E" al posto di "e")
c     carattere
s     stringa di caratteri
p     indirizzo di memoria (in esadecimale)

  [p02]

 


 

Specificatori di formato con ampiezza di campo e precisione

 

Anziché in free-format, si possono scrivere i dati in formato definito, tramite gli specificatori numerici di ampiezza di campo e precisione.

In uno specificatore di formato il campo opzionale width, costituito da un numero intero positivo, determina l'ampiezza di campo, cioè il numero di caratteri minimo con cui deve essere scritto il dato corrispondente. Se il numero di caratteri effettivo è inferiore, il campo viene riempito (normalmente) a sinistra con spazi bianchi; se invece il numero è superiore, il campo viene espanso fino a raggiungere la lunghezza effettiva (in altre parole il dato viene sempre scritto per intero, anche se il valore specificato in width è insufficiente). Se al posto di un numero si specifica nel campo width un asterisco, il valore viene desunto in esecuzione dalla lista degli argomenti della printf; in questo caso il valore dell'ampiezza di campo deve precedere immediatamente il dato a cui lo specificatore in esame si riferisce.

In uno specificatore di formato il campo opzionale precision, se presente, deve essere sempre preceduto da un punto (che lo separa dal campo width), ed è costituito da un numero intero non negativo, con significato che dipende dal contenuto del campo obbligatorio type, come si evince dalla seguente tabella:

contenuto campo   type     significato campo precision     default
d,i,u,o,x,X
(valori interi)
   

La precisione specifica il minimo numero di cifre che devono essere scritte. Se il numero di cifre effettive del dato corrispondente è minore della precisione, vengono scritti degli zeri sulla sinistra fino a completare il campo. Se invece il numero di cifre effettive è superiore, il dato è comunque scritto per intero senza nessun troncamento. Infine, se la precisione è .0 (oppure semplicemente .) e il dato è zero, non viene scritto nulla.

    1
f,e,E
(valori floating)
   

La precisione specifica il numero di cifre che devono essere scritte dopo il punto decimale. L'ultima cifra è arrotondata. Se la precisione è .0 (oppure semplicemente .), non è scritto neppure il punto decimale (in questo caso è arrotondata la cifra intera delle unità).

    6 cifre decimali
g,G
(valori floating)
   

La precisione specifica il massimo numero di cifre significative che devono essere scritte. L'ultima cifra è arrotondata. Gli zeri non significativi a destra non vengono scritti.

    6 cifre significative
c
(carattere)
   

La precisione non ha effetto.

       
s
(stringa)
   

La precisione specifica il massimo numero di caratteri che devono essere scritti. I caratteri in eccesso non vengono scritti.

    La stringa è scritta per intero

Come per l'ampiezza di campo, anche per la precisione, se al posto di un numero si specifica un asterisco, il valore viene desunto in esecuzione dalla lista degli argomenti della printf; anche in questo caso il valore della precisione deve precedere immediatamente il dato a cui lo specificatore in esame si riferisce.

 


 

Altri campi degli specificatori di formato

 

In uno specificatore di formato il campo opzionale flags è costituito da uno o più caratteri, ciascuno dei quali svolge una funzione particolare, come descritto dalla seguente tabella:

flag     significato     default
-    

Allinea la scrittura a sinistra in un campo con ampiezza specificata da width.

    Allineamento a destra
+    

Mette il segno (+ o –) davanti al numero.

    Il segno appare solo se il numero è negativo
spazio    

Mette uno spazio bianco davanti al numero, se questo è positivo.

    Nessuno spazio davanti ai numeri positivi
0    

Aggiunge zeri sulla sinistra fino a raggiungere l'ampiezza specificata da width. Se appaiono insieme 0 e -, 0 è ignorato.

    Il campo specificato da width è riempito da spazi bianchi
# (usato con o,x,X)    

Mette davanti a ogni valore diverso da zero i prefissi 0, 0x, o 0X, rispettivamente.

    Nessun prefisso davanti ai numeri
# (usato con e,E,f,g,G)    

Scrive sempre il punto decimale.

    Il punto decimale è scritto solo se è seguito da altre cifre
# (usato con g,G)    

Riempie tutto il campo con ampiezza specificata da width, scrivendo anche gli zeri non significativi.

    Gli zeri non significativi non vengono scritti

  [p03]

 


 

Torna all'Indice