f = format
printf
reprezentand o functie de tiparire formatata pe ecran
#include <stdio.h> // standard in out
Functia printf
este o functie standard a limbajului C cu numar variabil de argumente. O functie cu lista variablia de argumente trebuie sa aiba cel putin un param. Exista functii standard, dar si definite de noi.
Functia printf
are un parametru const char*
si 3 puncte
printf(const char*,...);
Parametrul obligatoriu (primul) contine textul ce se afiseaza pe ecran, adica este vorba de un string NULL
-terminat. In interiorul acestui text pot sa apara descriptori de tip. Acestia sunt inlocuiti la afisare cu valorile urmatorilor param ai functiei printf. De asemenea, in interiorul textului pot aparea si secvente escape.
ex.
int n=1;
float x=1.7f;
printf("Un intreg: %d, \nunreal: %f.\n",n,x);
%d
este inlocuit cu al doilea param din printf, deci cu n
%f
este inlocuit cu al treilea param din printf, deci cu x
\n
escape => salt la linie noua
Descriptorii de tip se inlocuiesc de la stanga la dreapta in ordinea intalnirii lor cu valorile param , incepand cu al doilea: in loc de primul descriptor de tip se pune valoarea celui de-al doilea param, al doilea descriptor se inlocuieste cu valoarea celui de-al treilea param. Trebuie avut grija:
- ca numarul descriptorilor de tip sa fie egal cu numarul de param ce urmeaza dupa primul
- fiecare descriptor de tip sa fie de acelasi tip de date cu al valorii param ce inlocuieste
Daca nu se respecta aceste reguli, nu este semnalata eroare sau avertizare la compilare, in schimb, afisarea poate fi defectuoasa, rezultand chiar o eroare fatala ce intrerupe executia.
Un descriptor de tip incepe cu caracterul procent %
si este urmat de unul sau mai multe caractere ce dau tipul de date si eventual informatii cu privire la formatarea afisarii valorii respective.
ex.
%d
-> descriptor de tip pentru afisarea unui numar intreg in baza 10 (d = decimal)
%f
-> descriptor de tip pentru o valoare de tip float (f = float)
Intre caracterul %
si litera/literele tipului de date pot aparea informatii de formatare la afisare.
ex.
%7d
-> se afiseaza un numar intreg in baza 10 pe 7 caractere cu aliniere la dreapta cele sase caractere suplimentare afisate cu variabila egala cu 1 sunt spatii
/_/_/_/_/_/_/1/
%-5d
-> se afiseaza un numar intreg in baza 10 pe 5 caractere cu aliniere la stanga
/1/_/_/_/_/
%7.2f
-> se afiseaza un numar real de tip float pe 7 caractere cu 2 cifre exacte dupa virgula si aliniat la dreapta
/_/_/_/1/./7/0/
%-7.2f
-> se afiseaza un numar real de tip float pe 7 caractere cu 2 cifre exacte dupa virgula si aliniat la stanga
%07.2f
-> se afiseaza un numar real de tip float pe 7 caractere cu 2 cifre exacte dupa virgula si aliniat la dreapta
/0/0/0/1/./7/0/
%0.2f
-> 2 zecimale exacte pe cate caractere incape
/1/./7/0/
%-20s
-> afisarea unui string pe 20 de caractere cu aliniere la stanga
%c
-> caracter ASCII
%s
-> string NULL-terminat
%d
-> intreg in baza 10
%u
-> unsigned int
%ld
-> long in baza 10
%lu
-> unsigned long in baza 10
%o
-> int in baza 8
%x
-> int in baza 16 (scris cu minuscule)
%X
-> int in baza 16 (scris cu majuscule)
%f
-> float forma zecimala fara exponent
%e
-> float cu exponent (e)
%E
-> float cu exponent (E)
%g
-> float (scrierea mai scurta dintre cu exponent sau fara exponent) (e)
%G
-> float (scrierea mai scurta dintre cu exponent sau fara exponent) (E)
%lf
- >
%le
- >
%lE
- > double ... (vezi mai sus)
%lg
- >
%lG
- >
%Lf
- >
%Le
- >
%LE
- > long double ... (vezi mai sus)
%Lg
- >
%LG
- >
%p
-> pointer: se afiseaza o adresa de memorie, adica un numar intreg in baza 16
In exemplul de mai sus am folosit de doua ori secventa escape \n
care introduce in string practic caracterul cu codul ASCII 13
, care la afisare are efectul de a se trece la linie noua (n = new line)
\n
\r
("return") se introduce caracterul ASCII 10
si are ca efect revenirea la inceputul liniei, fara a incepe o noua linie.
\t
("tab") se insereaza un caracter TAB
\b
("backspace") are ca efect mutarea cursorului cu o pozitie la stanga, fara a sterge caracterul
\f
("form feed") se introduce un caracter care are ca efect trecerea pe linie noua atunci cand folosim o imprimanta
\'
caracterul ' apostrof
\"
caracterul " ghilimele
\\
("backslash") aceasta secventa escape este folosita mai ales atunci cand specificam cai Windows
\%xcc
se afiseaza caracterul avand codul ASCII in baza 16 dat dupa x (adica codul ASCII al cc in baza 16)
ex.
%x4A
-> se va afisa 'J'
printf("Un test\r14\b ");
Un test 14 => 1 test
Functia scanf
este o fuctie standard din stdio.h
cu lista varianta de argumente folosita pentru citire de la tastatura a unor valori.
Antetul functiei: scanf(const char*,...);
Primul param al functiei scanf este tot un string NULL
-terminat care trebuie sa contina NUMAI descriptori de tip fara formatari sau alte caractere. Daca se introduc alte caractere decat cele pentru descriptori nu optinem eroare la compilare, ci executia este defectuoasa. Numarul descriptorilor de tip trebuie sa fie egal cu numarul param de dupa primul. De asemenea, tipurile descriptorilor trebuie sa fie compatibile cu cele ale valorilor citite de la tastatura si depuse in param de dupa primul.
ex.
int n;
float f;
printf("Dati un int si un float:\n);
scanf("%d%f",&n,&f);
%d
inseamna un descriptor de tip int , deci var n trebuie sa fie de tip int.
%f
inseamna descriptor pentru tipul float, deci var f trebuie sa fie de tip float.
&var
este un operator unar, care pus in fata unei variabile returneaza adresa de memorie alocata pentru var
La apelul functiei scanf se intalneste prima data descriptorul %d
. De la tastatura se preiau primele caractere pana la intalnirea spatiu, tab sau enter. Cf lui %d
, aceste caractere trebuie sa reprezinte forma text a unui numar intreg in baza 10. In consecinta, caracterele se convertesc la un numar intreg int
pe 4 octeti si se depun la adresa data de al doilea param, adica se depun la adresa lui n. Acelasi lucru se intampla pentru urmatoarele caractere intalnite pana la tab
, spatiu
sau enter
. Acestea sunt convertite la float
si valoarea obtinuta este depusa la adresa variabilei f
.
RAM: /_________/_/_/_/_/_______/_/_/_/_/____________/
&n &f
Este important de retinut ca spatiu
, tab
si enter
sunt delimitatori de tokeni cititi de la tastatura.
ex.
for(unsigned char c=0;c<256;c++)
printf("%c %d\n",c,c); //ciclu infinit, unsigned char nu depasaseste 255
for(int c=0;c<256;c++)
printf("%c %d\n",c,c); //se afiseaza tabela ASCII
stdout
-> ecran
stdin
-> tastatura
stderr
-> erori (mesajele de erori ajung tot pe ecran pe alta cale)
stdaux
-> COM1 (serial)
stdprn
-> LPT1 (paralel)
Pentru a trimite un text intr-un flux de iesire avem functia fprintf
care are doi param obligatorii, fluxul, stringul si altele...
fprintf(flux,str,...);
Functia fprintf
este asemanatoare cu printf
, cu deosebirea ca mesajul din al doilea param ajunge in fluxul dat in primul param.
ex.
fprintf(stdout,"un int%d",n);
se afiseaza pe ecran: un int ... ( unde ... reprezinta valoarea lui n)
fprintf(.......,"un int%d",n);
stderr
stdaux
stdprn
Functia fscanf(flux,str,...)
este similara cu scanf
, doar ca datele sunt luate cf fluxului
fscanf(......,str,...)
stdin
stdaux
stdprn
TPA: scdlt numele si varsta unor persoane se cere sa se afiseze tabelar aceste date. La sfarsit se va afisa varsta medie cu 2 zecimale exacte.