Sunteți pe pagina 1din 7

SIRURI DE CARACTERE

O constanta de tip sir de caractere de declara intre doua caractere . In memoria interna, o constanta de acest tip este retinuta
sub forma unui vector de caractere. Fiecare componenta a sirului (incepand cu cea de indice 0) retine codul ASCII al caracterului pe
care il memoreaza. Conventia este ca ultimul octet sa retina 0 (codul caracterului nul). Caracterul nul este memorat automat. rebuie
rezervate lungimea_sirului+! caractere c"ar (#! pentru caracterul nul).
$imba%ul C&C## permite initializarea unui tablou de caractere printr'o constanta sir, care include automat caracterul null.
Exemplu :
char vect[11]=calculator;
char vect[]=calculator; (compilatorul face calculul numarului de octeti necesari)
char vect[100]=calculator; (s'au rezervat mai multi octeti decat era necesar)

Sirurile de caractere sunt de fapt tablouri de caractere, care au ca ultim element un terminator de sir, caracterul null.
Exemplu:
char tc[5] = {a, b, c, d, e}; && tablou de caractere
char sc[5] = {a, b, c, d, \0}; && sir de caractere cu elementele abcd
(ltima initializare este ec"ivalenta cu)
char sc[5] = abcd; &&sau char sc[] = abcd;
char sc1[5] = abcd;
char s[10];
cout<<sc<<endln; &&afiseaza abcd
cout<<tc<<endl; &&eroare) tabloul de caractere nu contine terminatorul de sir, deci nu poate fi afisat ca sir
cout<<s<<endl; && eroare) tablou neinitializat
cout<<sc1[0]; && afiseaza primul caracter din sirul sc!
cout<<sc1[2]; && afiseaza al treilea element din sirul sc!
sc1[1]=K; && elementului din sir de indice ! i se atribuie valoarea *+,-

CITIREA / AFISAREA SIRURILOR DE CARACTERE

Sirurile de caractere pot fi initializate inca de la declarare sau citite pe parcursul pro.ramului.
a. Citirea unui sir de caractere se poate face ca citirea oricarui tablou, intr'un for, caracter cu caracter (desi nu este
recomandata). In acest caz, terminatorul de sir nu este memorat automat, el trebuie pus e/plicit dupa ultimul
caracter din sir.

Exemplu:
char c[20];
or!"nt "=0;"<=5;"##$
c"n%%c["];
cout<<c<<endl; &&se va afisa sirul format din cele 0 caractere, urmat de caractere 1reziduale2,
&&initializate implicit la compilare, din cauza ca n'a fost pus terminatorul de sir
c[&]=0;
cout<<c<<endl; &&a fost pus terminatorul de sir, deci sirul va fi afisat corect

b. Se poate face pur si simplu, folosind cin>>. Caracterul nul este adau.at automat. 3ezavanta%ul este ca in acest fel
nu se pot citi siruri care contin mai multe cuvinte separate prin spatii. Citirea sirului se sfarseste la intalnirea
primului caracter blan4 (de e/, daca se citeste ora de informatica2, variabila c va retine numai ora2).
Exemplu
char c['0];
c"n%%c;
cout<<c;

c. Se poate folosi o functie speciala pentru citirea sirurilor de caractere, inclusa in biblioteca str"n()h (varianta
recomandata).
Exemplu
char a['0],*;"nt nr;
c"n)(et!a,nr,*$;
Functia cin.get citeste un sir de caractere sau pana cand au fost citite nr'! caractere, sau daca s'a intalnit caracterul /. Al
treilea parametru poate lipsi, caz in care el este implicit caracterul ,5n, (ne6 line). Sunt citite si caracterele albe,
caracterul nul este inserat automat iar caracterul transmis ca ultim parametru nu este inserat in sir.
Exemplu
char a['0];
c"n)(et!a,5,s$; &&daca se citeste sirul maimuta, variabila a va retine maim2
c"n)(et!a,15,s$; &&daca se citeste sirul maimuta, variabila a va retine maimuta2
c"n)(et!a,15,t$; &&daca se citeste sirul maimuta, variabila a va retine maimu2
c"n)(et!a,+,t$; &&daca se citeste sirul maimuta, variabila a va retine mai2
c"n)(et!a,10$; &&daca se citeste sirul maimuta, variabila a va retine maimuta2

Functia cin.get( ) fara parametri are rolul de a citi un caracter (alb sau nu).
Functia cin.get(char c) are rolul de a citi un caracter (alb sau nu) pe care il incarca in variabila c.

Observatie) In cazul utilizarii repetate a functiei c"n)(et!a,nr,*$, dupa fiecare folosire trebuie citit caracterul de
la sfarsitul fiecarui sir , adica ,5n, (in caz contrar, acest caracter va fi incarcat la inceputul urmatorului sir, a carui citire se
termina la caracterul 7nter, deci citirea celui de'al doilea sir se termina inainte de a incepe, iar al doilea sir va fi sirul
vid). Aceasta citire a caracterului ,5n, se realizeaza folosind c"n)(et!$ fara parametri.

Exemplu
char a['0],b['0];
c"n)(et!a,15$;
c"n)(et!b,10$;
3aca se incearca citirea sirurilor 1sarbatoare2 si 1vacanta2, se observa ca a82sarbatoare2, b822 (nici nu apucam sa citim
sirul b). 9arianta corecta este)
c"n)(et!a,15$;
c"n)(et!$;
c"n)(et!b,10$;

Afisarea unui sir de caractere se face folosind cout.
cout<<a;
Se poate afisa si caracter cu caracter, ca in cazul tablourilor, dar aceasta varianta nu este recomandata.


FUNCTII PENTRU OPERATII CU SIRURI DE CARACTERE

Functiile pentru operatii cu siruri se .asesc in "eader'ul <string.h>.

Functia strlen
"nt strlen!nu,e-s"r$; : returneaza lun.imea efectiva a unui sir (fara a numara terminatorul de sir).
Exemplu)
char a[50]=ora de "nor,at"ca; strlen(a) 8 !;

Functia strcpy
strcpy!s"r-dest"nat"e,s"r-sursa$; copiaza sirul sir< sursa in sir<dest"nat"e (se simuleaza atribuirea
a8b).
ATENTIE== Nu este permisa atribuirea intre doua siruri de caractere folosind operatorul 8. Atribuirea se face folosind
functia strcpy .
Exemplu:
char a[50]=.r",ul s"r,b[+0]=al do"lea s"r;
a=b; &&eroare
strc./!a,b$; a = al do"lea s"r; b=al do"lea s"r;

Functia strcat
strcat!dest,sursa$; : adau.a sirului dest sirul sursa) Sirul sursa ramane nemodificat. Operatia se
numeste concatenare si nu este comutativa.
Exemplu:
char 0a=v"ne ,0b=vacanta1;
strcat!a,b$; a = v"ne vacanta1;

Functia strncat
strncat!dest,sursa,nr$; : adau.a dest primele nr caractere din sirul sursa) Sirul sursa ramane
nemodificat.
Exemplu:
char 0a=v"ne ,0b=vacanta1;
strncat!a,b,+$; a = v"ne vaca;

Functia strchr
strchr!s"r,c$; : are rolul de a cauta caracterul c in sirul sir. Cautarea se face de la stan.a la dreapta, iar functia
intoarce adresa subsirului care incepe cu prima aparitie a caracterului c. 3aca nu este .asit caracterul, functia returneaza 0.
3iferenta dintre adresa sirului initial si cea a subsirului returnat reprezinta c"iar pozitia caracterului cautat in sirul dat.
Exemplu)
char 0a=acesta este un s"r,b=t,c=*,d;
cout<<strchr!a,b$; se tipareste ta este un s"r;
cout<<strchr!a,c$; nu se t".areste n","c !se tipareste 0 daca se face o conversie la "nt a
lui strchr!a,c$ ;
d= strchr!a,b$;
cout<<2aracterul a.are .r",a data la .o3"t"a <<d4a;

5*6 7a se a"se3e toate .o3"t""le unu" caracter "ntr4un s"r
8"nclude <"ostrea,)h%
8"nclude <str"n()h%
vo"d ,a"n!$
{char a[100],0.,c;
c"n)(et!a,100$;
c"n%%c;
.=strchr!a,c$;
9h"le !.$
{cout<<:;o3"t"a :<<.4a<<endl;
.##;
.=strchr!.,c$;}}

Functia strrchr
strrchr!s"r,c$; : are acelasi rol cu strchr, cu deosebirea ca returneaza adresa ultimei aparitii a caracterului
(cautarea se face de la dreapta spre stan.a- r 8 ri."t)

Functia strcmp
"nt strc,.!s"r1,s"r2$; : are rolul de a compara doua siruri de caractere. 9aloarea returnata este >0
(daca s"r1>s"r2), 80 (daca s"r1=s"r2) si ?0 (daca s"r1%s"r2). Functia strc,.face distinctie intre literele mari si
cele mici ale alfabetului.
Obs) Functia strcmp returneaza diferenta dintre codurile ASCII ale primelor caractere care nu coincid

Functia stricmp
"nt str"c,.!s"r1,s"r2$; : are acelasi rol cu strc,., cu deosebirea ca nu face distinctie intre literele mari si cele
mici ale alfabetului (i 8 i.nore).

Functia strstr
strstr!s"r1,s"r2$; : are rolul de a identifica daca sirul s"r2 este subsir al sirului s"r1) 3aca este, functia
returneaza adresa de inceput a subsirului s"r2 in sirul s"r1, altfel returneaza adresa 0. In cazul in care s"r2 apare de mai
multe ori in s"r1, se returneaza adresa de inceput a primei aparitii. Cautarea se face de la stan.a la dreapta

Functia strt!
strto<!s"r1,s"r2$; : are rolul de a separa sirul s"r1 in mai multe siruri (cuvinte) separate intre ele prin unul sau
mai multe caractere cu rol de separator. Sirul s"r2 este alcatuit din unul sau mai multe caractere cu rol de separator.
Functia strt! actioneaza in felul urmator)
o @rimul apel trebuie sa fie de forma strto4(sir!,sirA)- Functia intoarce adresa primului caracter al primei entitati. 3upa
prima entitate, separatorul este inlocuit automat prin caracterul nul.
o (rmatoarele apeluri sunt de forma strto4(B($$,sirA)- 3e fiecare data, functia intoarce adresa de inceput a urmatoarei
entitati, adau.and automat dupa ea caracterul nul.
o Cand sirul nu mai contine entitati, functia returneaza adresa nula.
Exemplu)
==7a se se.are cuv"ntele d"ntr4un te*t)
8"nclude <"ostrea,)h%
8"nclude <con"o)h%
8"nclude <str"n()h%
vo"d ,a"n!$
{char te*t[100],cuv[10][10],0.,0r,se.arator[]=:,) >1:;"nt "=0,nr=0;
clrscr!$;
cout<<:?at" s"rul6:;c"n)(et!te*t,100$;
strc./!.,te*t$;
.=strto<!.,se.arator$;
9h"le !.$
{strc./!cuv[##nr],.$;
.=strto<!@ABB,se.arator$;}
cout<<:7unt :<<nr<<: cuv"nte6:<<endl;
or !"=1;"<=nr;"##$ cout<<cuv["]<<endl;
(etch!$;}
Functia strspn cu forma .enerala
"nt strs.n!s"r1,s"r2$; : are rolul de a returna numarul de caractere ale sirului s"r1 (caractere consecutive care
incep obli.atoriu cu primul caracter) care se .asesc in sirul s"r2.
Exemplu)
strs.n!CDE2de,1E'DFG$; returneaza A, pentru ca primele A caractere *A, si *C,
din s"r1 se .asesc in s"r2)
strs.n!CHDE2de,1&D'2EH$; returneaza 0, deoarece caracterul *F, cu care incepe s"r1 nu se .aseste
in s"r2)

Functia strcspn cu forma .enerala
"nt strs.n!s"r1,s"r2$; : are rolul de a returna numarul de caractere ale sirului s"r1 (caractere consecutive care
incep obli.atoriu cu primul caracter) care nu se .asesc in sirul s"r2.
Exemplu)
strs.n!CDE2de,12'$; returneaza A, pentru ca primele A caractere din s"r1 nu se .asesc in s"r2)
==7e c"teste un s"r de caractere care nu cont"ne caractere albe) 7a se dec"da daca
s"rul este alcatu"t e*clus"v d"n caractere nu,er"ce)
8"nclude <"ostrea,)h%
8"nclude <con"o)h%
8"nclude <str"n()h%
vo"d ,a"n!$
{char te*t[100],c"re[]=:012'+5&IJK:;
clrscr!$;
cout<<:?at" s"rul6:;c"n)(et!te*t,100$;
" !strcs.n!c"re,te*t$==strlen!te*t$$
cout<<:e*clus"v nu,er"c:;
else cout<<nenu,er"c;
(etch!$;}
Functia strl"r cu forma .enerala
strl9r!s"r$; : are rolul de a converti toate literele mari din s"r in litere mici. Destul caracterelor raman nesc"imbate.

Functia strupr cu forma .enerala
stru.r!s"r$; : are rolul de a converti toate literele mici din s"r in litere mari. Destul caracterelor raman nesc"imbate
Functia str#r! cu forma .enerala
str.br<!s"r1,s"r2$; : actioneaza in felul urmator)
o Cauta primul caracter al sirului s"r1 in s"r2. 3aca este .asit, returneaza adresa sa din cadrul sirului s"r1 si
e/ecutia se termina. Altfel, se trece la pasul urmator.
o Cauta al doilea caracter al sirului s"r1 in s"r2. 3aca este .asit, returneaza adresa sa din cadrul sirului s"r1 si
e/ecutia se termina. Altfel, se trece la pasul urmator.
o E
o 3aca nici un caracter al sirului s"r1 nu apartine sirului s"r2, functia returneaza adresa nula.
Functia at$ cu forma .enerala
double ato!s"r$; : converteste un sir catre tipul double. 3aca aceasta conversie esueaza (se intalneste un caracter
nenumeric), valoarea intoarsa este 0. Aceasta functie (ca si cele similare) necesita includerea librariei stdl"b)h)
Functia <atl% cu forma .enerala
lon. double -atold!s"r$; : converteste un sir catre tipul lon. double. 3aca aceasta conversie esueaza, valoarea
intoarsa este 0.

Functia ati cu forma .enerala
"nt ato"!s"r$; : converteste un sir catre tipul int. 3aca aceasta conversie esueaza (se intalneste un caracter
nenumeric), valoarea intoarsa este 0.

Functia atl cu forma .enerala
lon( atol!s"r$; : converteste un sir catre tipul lon.. 3aca aceasta conversie esueaza (se intalneste un caracter
nenumeric), valoarea intoarsa este 0.

Functia ita cu forma .enerala
"toa!"nt valoare,s"r,"nt ba3a$; : converteste o valoare de tip int in sir, care este memorat in variabila s"r.
Caza retine baza de numeratie catre care sa se faca conversia. In cazul bazei !0, sirul retine si eventualul semn '.

Functia lta cu forma .enerala
ltoa!lon( valoare,s"r,"nt ba3a$; : converteste o valoare de tip lon( "nt in sir, care este memorat in
variabila s"r.

Functia ulta cu forma .enerala
ultoa!uns"(ned lon( valoare,s"r,"nt ba3a$; : converteste o valoare de tip unsi.ned lon( in sir, care
este memorat in variabila s"r.
Probleme propuse)
!. Sa se verifice daca un cuvant este palindrom.
A. Sa se transforme un sir din litere mici in litere mari.
F. Sa se transforme un sir din litere mari in litere mici.
G. Sa se determine frecventa de aparitie a unui caracter intr'un te/t.
H. Sa se .enereze toate prefi/ele & sufi/ele unui cuvant.
0. Se citeste un te/t dintr'un fisier si un caracter c. Sa se determine de cate ori se .aseste caracterul in te/t (nu se face
distinctie intre literele mari si literele mici).
I. Se citeste un te/t de la tastatura astfel incat cuvintele sa fie separate printr'un sin.ur spatiu si imediat dupa ultimul
cuvant se scrie punct. e/tul va fi scris pe un sin.ur rand.
a) Sa se determine cate cuvinte contine te/tul. 3e e/ ) JAna are mere.J Contine F cuvinte.
b) Sa se determine daca te/tul are cuvinte distincte (se i.nora diferenta de c"eie).
c) Sa se determine daca te/tul contine cifre.
;. Sa se determine de cate ori se .aseste un cuvant intr'un te/t.
K. Codificati un te/t astfel incat litera a sa devina c, b sa devina e s.a.m.d.
!0. Sa se sorteze alfabetic un sir de cuvinte (eventual, fara a distin.e literele mici de cele mari).
!!. Codificarea pasareasca a unui cuvant (dupa fiecare vocala, se pune litera p urmata de acea vocala). 7/ )
informatica ipinfopormapatipicapa
!A. Se citesc n cuvinte. Sa se afiseseze .rupurile de cuvinte care rimeaza (au ultimele A caractere identice).
!F. Sa se desparta un te/t in cuvinte si sa se afiseze cuvintele separate. Sa se afiseze cuvantul de lun.ime ma/ima.
!G. Sa se verifice daca doua cuvinte sunt sau nu ana.rame.
!H. Sa se numere aparitiile unui cuvant intr'un te/t.
!0. Se citeste un numar real de la tastatura. Sa se trunc"ieze astfel incat cifrele ramase sa formeze o secventa monotona.
7/. FG.HKG;F FG.HK - AG.!AI0 AG
17. Se citeste un sir de caractere alfanumerice. Consideram ca literele sunt separatorii numerelor. Afisati datele de tip
numeric preluate in ordine din sirul citit. Bumerele vor fi scrise cate unul pe o linie.
7/.
in.txt out.txt
a23sc345ss5e 23
345
5
!;. In directorul curent se afla fisierul cuvinte.t/t care contine mai multe linii de te/t formate din cuvinte separate de cate un
spatiu. Sa se afiseze cuvintele care au cel putin F consoane sau F vocale consecutive.
!K. Se citeste un sir de caractere. Sa se afiseze sirul o.lindit din care lipsesc vocalele.
A0. Se da un te/t de ma/im F0 de caractere. Sa se listeze toate cuvintele de doua caractere din acest te/t.
A!. Se introduc de la tastatura cuvinte pana la citirea cuvantului stop. Afisati pe ecran cuvintele mai mari in sens
le/ico.rafic decat primul citit.
AA. Se dau doua te/te. Sa se stabileasca o vocala comuna celor doua te/te, care apare de cele mai putine ori.
AF. 3intr'un fisier se citeste un te/t. e/tul contine cuvinte separate printr'un spatiu. Sa se determine cate cuvinte contine
te/tul.
AG. 3intr'un fisier se citeste un te/t. e/tul contine cuvinte separate printr'un spatiu. Se va .enera un nou te/t care va
contine cuvintele ordonate alfabetic
AH. 3intr'un fisier se citeste un te/t. e/tul contine cuvinte separate printr'un spatiu. Sa se scrie intr'un alt fisier, pe linii
separate, fiecare cuvant care apare in te/t urmat de un numar care va reprezenta de cate ori apare cuvantul in te/t. Sa se
determine cuvantul care apare de cele mai multe ori.
A0. 3intr'un fisier se citeste un te/t. e/tul contine cuvinte separate printr'un spatiu. Intr'un alt fisier se va scrie pe linii
separate fiecare cuvant si liniile pe care apare.
AI. 3intr'un fisier se citeste un te/t. e/tul contine cuvinte separate printr'un spatiu sau mai multe. Se va .enera un nou
fisier care va contine te/tul initial avand spatiile de prisos eliminate (intre cuvinte va ramane numai cate un spatiu).
A;. Se citesc de la tastatura elementele unei matrici de caractere (nr. linii8nr. coloane), A(BLB), B>8!0.
a) Sa se afiseze matricea A-
b) Sa se formeze si sa se afiseze cuvantul format din caracterele pe pe dia.onala principala a matricii A-
c) Sa se calculeze si sa se afiseze numarul de litere mari, litere mici si cifre din matrice-
d) Sa se afiseze cuvantul format din caracterele de pe dia.onala secundara-
e) Sa se afiseze procentul literelor mari, al literelor mici si al cifrelor de pe cele A dia.onale-
f) Sa se afiseze caracterele comune aflate pe liniile p si M (p, M > B, p si M citite de la tastatura)-
.) Sa se afiseze in ordine alfabetica, crescatoare, literele mari aflate pe coloanele impare.
AK. Simulati comanda D7@$AC7 astfel incat intr'un te/t veti inlocui un caracter / citit de la tastatura cu un alt caracter N
citit de la tastatura. Se i.nora sau nu diferenta de c"eie dupa optiunea utilizatorului.
F0. Simulati comanda D7@$AC7 astfel incat intr'un te/t veti inlocui un sir / citit de la tastatura cu un alt caracter sir N citit
de la tastatura. Se i.nora sau nu diferenta de c"eie dupa optiunea utilizatorului.
F!. Se citeste de la tastatura un cuvant. Sa se stabileasca daca el contine doua litere alaturate identice, afisandu'se un mesa%
corespunzator.
FA. 3intr'un fisier se citesc numele a n persoane. Sa se modifice continutul fisierului astfel incat toate numele sa fie scrise
astfel) prima litera mare si restul litere mici.
FF. Se citesc n siruri. @entru fiecare sir se va determina suma codurilor ASCII.
FG. Intr'un fisier sunt scrise cuvinte pe linii separate. Sa se afiseze cuvintele care contin ma%uscule.
FH. Intr'un fisier sunt scrise pe randuri diferite numele a n copii. Sa se modifice continutul fisierului astfel incat sa contina
numele ordonate crescator.
F0. Sa se afiseze vocalele unui cuvant.
FI. Sa se afiseze cuvintele care incep si se termina cu consoana, (vocala) etc.
F;. Sa se desparta un te/t in cuvinte si sa se afiseze cuvintele separate. Sa se afiseze cuvantul de lun.ime ma/ima.
FK. Intr'un te/t e/ista un cuvant. Codificati&decodificati cuvantul dupa un al.oritm .enerat de voi.
G0. Aceeasi problema pentru un te/t.
G!. Se dau doua te/te. Sa se stabileasca o vocala comuna celor doua te/te, care apare de cele mai putine ori.
GA. 3intr'un fisier se citeste un te/t. e/tul contine cuvinte separate printr'un spatiu. Sa se determine cate cuvinte contine
te/tul.
GF. Se citesc n cuvinte. Sa se afiseze perec"ile de A cuvinte care rimeaza.
GG. Aceeasi problema, numai ca se vor afisa .rupurilede cuvinte care rimeaza
GH. Se citesc cuvinte pana la citirea cuvantului JstopJ. Sa se afiseze cate dintre cuvintele citite sunt e.ale cu primul cuvant
citit.
G0. Se citeste un te/t. e/tul contine cuvinte separate printr'un spatiu. Se va .enera un nou te/t care va contine cuvintele
ordonate alfabetic
GI. Se citeste un te/t. e/tul contine cuvinte separate printr'un spatiu. Sa se scrie, pe linii separate, fiecare cuvant care apare
in te/t urmat de un numar care va reprezenta de cate ori apare cuvantul in te/t. Sa se determine cuvantul care apare de
cele mai multe ori.
G;. Se citeste un te/t. e/tul contine cuvinte separate printr'un spatiu. Sa se scrie, pe linii separate, fiecare cuvant si liniile
pe care apare.
GK. Se citeste un te/t care contine cuvinte separate printr'un spatiu sau mai multe. Se va .enera un nou te/t care va contine
te/tul initial avand spatiile de prisos eliminate (intre cuvinte va ramane numai cate un spatiu).
H0. Simulati scrierea unei parole intr'un fisier. $a tastarea parolei pe ecran in locul fiecarui caracter se va scrie caracterul OPO.
7ventual realizati si incriptarea parolei inainte de a fi scrisa intr'un fisier.
H!. Fie un sir de forma) cifra'litera, cifra litera Eetc. 7/ AaGbHc. Sa se .enereze un astfel de sir) aabbbbccccc.
HA. Fie un sir format din replicarea de un numar de ori a unui subsir redundant. Sa se determine cea mai scurta secventa
redundanta. Se va afisa subsirul redundant si numarul sau de aparitii. 7/ pt) aabcaabcaabcaabc se va fisa) aabc si nu
aabcaabc. Bumarul de aparitii este G si nu A.
HF.

S-ar putea să vă placă și