Iesirea formatata-printf
Cele doua rutine "printf" pentru iesire si scanf pentru
intrare permit translatarea in si din reprezentarea caracterelor
a cantitatilor numerice. Ele de asemenea permit generarea sau
interpretarea liniilor formatate. Am folosit deja "printf" in
capitolele precedente ; aici ii dam o descriere mai precisa si
complecta.
printf(control, arg1, arg2,....)
printf converteste, formateaza si tipareste argumentele sale
la iesirea standard sub controlul sirului "control". Sirul de
control contine doua tipuri de obiecte: caractere ordinare, care
sint simplu copiate in sirul de iesire si semnificatii de
conversie dintre care fiecare cauzeaza conversia si tiparirea a
urmatoarelor argumente succesive ale printf.
Fiecare specificatie de conversie este introdusa prin caracterul %
si incheiata printr-un caracter de conversie. Intre % si
caracterul de conversie pot fi:
Un semn minus care specifica cadrarea la stinga in cimp a
argumentului convertit.
Un sir de digiti care specifica o lungime minima a
cimpului. Numarul convertit va fi introdus in cimp la cel
putin aceasta lungime sau mai mare daca este necesr. Daca
argumentul are mai putine caractere decit dimensiunea
cimpului el va fi cadrat la dreapta sau la stinga (in
funcite de specificatie sau implicit) si va fi completatcu
zero sau spatii pina la lungimea cimpului. Caracterul de
complectare este normal blank, iar daca dimensiunea
cimpului a fost specificata prin "leading" zero, este
zero (aceasta nu implica cimpurile octale).
O virgula, care separa lungimea cimpului de un alt sir de digiti.
Un sir de digiti (precizia), care specifica numarul maxim
de caractere acceptate dintr-un sir, sau numarul de
pozitii dupa virgula zecimala virgula flotanta si dubla
precizie.
Caracterele de conversie si semnificatiile lor sint:
d-argumentul este convertit in zecimal
o-argumentul este convertit in octal fara semn
x-argumentul este convertit in hexazecimal fara semn
u-argumentul este convertit in zecimal fara semn
c-argumentul este preluat ca un singur caracter
s-argumentul este un sir ;caracterele din sir sint introduse
pina cind este intilnit caracterul nul sau pina cind este atinsa
lungimea specificata.
e-argumentul este luat ca virgula flotanta sau dubla precizie si
convertit in notatia zecimala de forma [-]m. nnnnnnE[+sau-]XX
unde lungimea sirului de n-uri este specificata de precizie.
Precizia implicita este 6.
f-argumentul este luat ca virgula mobila sau dubla precizie si
convertit tot intr-o notatie zecimala de forma [-]mmm. nnnnnn unde
lungimea sirului de n-uri este specificat de precizie,
implicit este 6. De observat ca precizia nu determina numarul de
digiti semnificativi in formatul f.
g-foloseste % sau %l , oricare este mai scurt ; zerourile
nesemnificative nu apar. Daca caracterul de dupa % nu este
un caracter de conversie acest caracter este tiparit chiar 5
poate fi tiparit prin %%.
Cele mai multe formate de conversie sint evidente si au fost
ilustrate in capitolele precedente. oO exceptie este precizia
referitoare la siruri. Tabela urmatoare arata efectele unei
varietati de specificatii asupra sirului "hello, world" de 12
caractere. Am pus doua puncte pentru a putea urmari mai bine
lungimea.
::%10s: :hello, world:
:5-10s: :hello, world:
:%20s: : hello, world:
:%-20s: :hello, world :
:%20. 10s: : hello, wor:
:%-20. 10 :hello, wor :
:%. 10s: :hello, wor:
Atentiune: "printf" foloseste primul sau argument pentru a
decide cite argumente urmeaza si de ce tip. Daca nu sint
destule argumente sau de tip gresit veti obtine rezultate lipsite
de sens.
Exercitiul 7.1 Scrieti un program care tipareste diferentiat o
intrare arbitrara. Ca o conditie minima trebuie sa tipareasca
caracterele non-grafice in octal sau hexa(conform uzantelor
locale).