You are on page 1of 6

Curs 6.

Utilizarea irurilor
Cea mai comun utilizare a tabloului unidimensional n limbajul C este irul. Spre deosebire
de alte limbaje de programare, limbajul C nu conine tipul String, ns, permite utilizarea irurilor
folosind tablouri unidimensionale de tip char. irul se definete ca fiind un tablou de caractere
terminat prin caracterul null (\0). Faptul c irul trebuie terminat prin caracterul null nseamn c
tabloul trebuie astfel definit nct s poat conine un ir cu un octet mai lung dect cel mai lung ir
ce a fi reprezentat n tabloul respecti, i asta pentru a se face loc caracterului null.
Macrourile getchar i putchar
!acroul getchar() permite citirea cu ecou a caracterelor codului "SC##. Caracterele tastate
se introduc ntr$un buffer de memorie pn la acionarea tastei %&'%(. )a reenire, se returneaz
codul "SC## al primului caracter introdus, iar la un nou apel, al urmtorului caracter introdus etc.
)a ntlnirea sfritului de fiier *CTRL/Z+ se returneaz aloare %,F*-.+.
!acroul putchar afieaz caracterul al crui cod "SC## s-a transmis. !acrourile getchar i
putchar sunt definite n fiierul stdio.h.
Ex. 6.1. S se scrie un program care citete un caracter de la tastatur i l afieaz apoi pe
ecran.
/include 0stdio.12
main*+
3
c1ar caracter4
caracter5getc1ar*+4
6
Cnd se ruleaz acest program, compilatorul ateapt introducerea unui caracter4 dup
introducerea caracterului, utilizatorul trebuie s apase tasta %&'%( pentru a se realiza citirea
primului caracter tastat. 7ac ns nu se dorete apsarea acestei taste dup tastarea caracterului, se
poate folosi funcia getche(), care faorizeaz e8ecutarea urmtoarei instruciuni de dup getche(),
fr s mai atepte apsarea tastei %&'%(.
Funciile gets i puts
Funcia gets() poate fi folosit pentru introducerea de la terminalul standard a unei
succesiuni de caractere terminate prin apsarea tastei ETER. Citirea caracterelor de la tastatur se
face fr ecou i pot fi citite doar caractere ale codului !SC"".
Funcia gets() are ca parametru adresa de nceput a zonei de memorie n care se pstreaz
caracterele citite. 7e obicei, aceast zon de memorie este alocat unui tablou unidimensional de tip
char. 7eoarece numele unui tablou are ca aloare adresa de nceput a zonei de memorie alocate,
rezult c numele unui tablou poate fi utilizat ca parametru n apelul funciei gets(). "stfel,
caracterele citite se or pstra n tabloul respecti.
Funcia returneaz adresa de nceput a zonei de memorie n care s$au pstrat caracterele. )a
ntlnirea sfritului de fiier, se returneaz aloarea 9. "cest 9 nu reprezint o adres posibil
pentru funcie i de aceea ea poate fi folosit pentru a semnala sfritul fiierului. 7e obicei,
aloarea returnat de funcia gets() nu se testeaz fa de 9, ci fa de constanta simbolic null
definit n fiierul stdio#h.
Funcia gets() trebuie apelat folosind numele tabloului de caractere fr nici un inde8.
"ceasta citete pn cnd este apsat tasta (%':(& *%&'%(+. "ceast tast este nlocuit de
compilator prin caracterul null care termin irul.
Spre e8emplu, dac aem urmtoarea declaraie;
c1ar tab<=>>?
atunci apelul
gets*tab+4
pstreaz n ariabila tab caracterele introduse la terminalul standard.
@n ceea ce priete funcia puts(), aceasta afieaz un ir de caractere ale codului !SC"".
7up afiarea irului, cursorul a trece automat pe linia urmtoare *caracterul null se nlocuiete cu
ne$line+.
Funcia puts() are ca parametru adresa de nceput a zonei de memorie care conine
caracterele de afiat. @n cazul n care caracterele care trebuie afiate sunt memorate ntr$un tablou cu
o dimensiune de tip char, atunci ca parametru se a folosi numele tabloului. Spre e8emplu, dac
pentru tabloul declarat anterior aem;
puts*tab+4
pe ecran a fi afiat irul preluat prin intermediul funciei gets().
Ex.6.2. Folosirea funciilor gets, putchar, puts i getch.
/include 0stdio.12
/include 0conio.12
main*+
3
c1ar nume<=>>?, prenume<=>>?4
gets*nume+4
gets*prenume+4
putc1ar*nume<9?+4
putc1ar*A.A+4
putc1ar*prenume<9?+4
putc1ar*A.A+4
putc1ar*ABnA+4
puts*nume+4
puts*prenume+4
getc1*+4
6
Ciblioteca C standard conine mai multe funcii pentru manipularea irurilor. Cele mai
importante dintre ele sunt;
strcpy (sir1, sir2) copiaz coninutul irului sir2 n irul sir1. Ex
/include 0stdio.12
main*+
3
c1ar sir.<?5D"ceste este sirul . care a fi copiat in sirul = EEED4
c1ar sir=<.99?4
strcpF*sir=,sir.+4
printf*DGsBnBnD,sir=+4
6
strcat(sir1, sir2) concateneaz dou iruri. !ceast funcie adaug coninutul irului sir2
la coninutul lui sir1.
/include 0stdio.12
main*+
3
c1ar sir.<?5DSalutare D4
c1ar sir=<?5DHrogramatoriD4
strcat*sir.,sir=+4
printf*DGsBnBnD,sir.+4
6
strcmp(sir1,sir2) compar dou iruri de caractere4 funcia returneaz zero dac irurile
sunt identice, mai mic dect zero dac %ir& este mai mic dect %ir' i mai mare dect zero dac
%ir& este mai mare dect %ir'. Cele dou iruri se compar le8ilografic, adic n ordinea din
dicionar. 7eci, un ir este mai mic dect altul dac el apare mai n fa n dicionar. Comparaia
nu se bazeaz pe lungimea irurilor, iar literele mari se trateaz diferit fa de literele mici.
strlen(ir) returneaz lungimea irului *numrul de caractere al irului+. Spre e8emplu,
pentru programul de mai sus; strlen(sir') a returna aloarea .=.
atoi() returneaz ntregul echi"alent al numrului reprezentat de irul argument. Spre
e8emplu, atoi(100) returneaz "aloarea #$$ care poate fi folosit ca un ntreg. Hentru a
folosi funcia atoi() este necesar fiierul 1eader S%&'().*.
Ex. 6.3. S se realizeze un program care citete i afieaz un ir introdus de la tastatur.
(include )stdio#h*
main()
+
char sir,-0./
int i0a/
printf(1"ntroduceti un sir ) -0 de caractere2\n\n1)/
gets(sir)/
a3strlen(sir)/
for (i30/sir,i./i44)
printf(15c10sir,i.)/
printf(1\n\n1)/
6
%a+louri de iruri
'ablourile de iruri sunt frecent folosite n C# :n tablou bidimensional de iruri se poate
crea ca oricare alt tablou bidimesnional, ns maniera n care se gndete un astfel de tablou este
puin diferit. Fie urmtoarea declaraie;
char nume,#$-,.$-/
"ceast declaraie specific un tablou care conine .9 iruri, fiecare cu lungimea ma8im de I9 de
caractere. Hentru accesarea unui ir din tablou, trebuie specificat numai primul inde8. Spre e8emplu,
pentru a citi de la tastatur ultimul ir al tabloului, se folosete instruciunea;
gets0nume,1-2/
E7# 8#9# S: se reali;e;e un program care s: permit: introducerea a < %iruri de c=te <0 de caractere
fiecare %i apoi afi%ea;: unul dintre ele >n func?ie de op?iunea utili;atorului/ pentru ie%ire trebuie
ap:sat num:rul 8#
/include 0stdio.12
main*+
3
int i,nr4
c1ar sir<>?<>9?4
printf*D#ntroduceti cele > siruri;BnBnD+4
for *i594i0>4iJJ+
3
printf*DSGd; D,iJ.+4
gets*sir<i?+4
6
do
3
printf*DBnBn#ntroduceti numarul sirului care a fi afisat sau K pentru iesire;D+4
scanf*DGdD,Lnr+4
if *nr0K LL nr 29+
printf*DBnBnGsD,sir<nr$.?+4
6M1ile *nrE5K+4
6
E7# 8#<# S: se scrie un program care s: citeasc: >n mod repetat %iruri de la tastatur: p=n: c=nd se
introduce %irul uit#
/include 0stdio.12
main*+
3
c1ar sir.<.99?4
do
3
printf*DBn#ntroduceti un sir pentru afisare sau Nuit pentru iesire;D+4
gets*sir.+4
printf*DBnSirul introdus este; GsD,sir.+4
6M1ile*strcmp*sir.,DNuitD++4
6

E7# 8#8# S: se scrie un program care s: citeasc: %iruri# @ac: %irul are mai pu?in de -0 de caractere0
completa?i caracterele libere cu puncte# !fi%a?i apoi %irul pentru a Aerifica dac: lungimea sa a fost
corect calculat:#
/include 0stdio.12
/include0conio.12
main*+
3
c1ar sir<O9?4
int i4
printf*D#ntroduceti un sir;D+4
gets*sir+4
for*i5strlen*sir+4i0O94iJJ+
strcat*sir,D.D+4
printf*DBnBnGsD,sir+4
6
,CS%(P"Q##;
.. Caracterele unui ir de caractere se pstreaz n memorie ntr$o zon contigu, prin
intermediul codurilor lor "SC##. 7up ultimul caracter al irului se pstreaz caracterul
&:)), adic aloarea 9. "cesta joac rolul unui marcaj de sfrit de fiier al oricrui ir de
caractere. 7atorit acestui marcaj, trebuie fcut deosebirea dintre o constant caracter care
corespunde unui caracter i irul de caractere care este format din acelai caracter. "stfel,
constanta caracter; R"S se pstreaz n memorie ntr$un octet prin aloarea K>, pe cnd irul
T"U ocup doi octei; n primul se pstreaz aloarea K>, iar n al doilea caracterul &:)),
reprezentat prin aloarea 9.
=. *C:V+ &u se recomand folosirea funciei gets*+ deoarece este imposibil s se spun *fr
s se cunoasc datele n prealabil+ cte caractare se or citi prin intermediul acestei funcii i
deoarece se a continua s se stoc1eze caractere citite anterior de la sfritul buffer$ului,
moti pentru care este e8trem de periculos sa se utilizeze n practica curent.
1ttp;WWlinu8.die.netW

You might also like