Documente Academic
Documente Profesional
Documente Cultură
Sirurile de caractere pot fi initializate inca de la declarare sau citite pe parcursul programului.
1. Citirea unui sir de caractere se poate face ca citirea oricarui tablou, intr-un for, caracter cu caracter.
Aceasta varianta nu este recomandata. In acest caz, terminatorul de sir '\0' nu este memorat automat,
el trebuie pus explicit dupa ultimul caracter din sir.
Exemplu:
char sir[20];
for(int i=0;i<=5;i++)
cin>>sir[i];
cout<<sir<<endl; /*se va afisa sirul format din cele 6 caractere, urmat de caractere reziduale,
initializate implicit la compilare, din cauza ca n-a fost pus terminatorul de sir*/
sir[6]=0;
//introducem terminatorul de sir
cout<<sir<<endl; //sirul va fi afisat corect
2. Se poate face folosind cin>>. Caracterul nul este adaugat automat.
Dezavantajul 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 blank.
De exemplu, daca se sirul este clasa a XI-a, variabila sir va retine numai clasa.
Exemplu:
char sir[30];
cin>>sir;
cout<<sir;
3. Se poate folosi o functie speciala pentru citirea sirurilor de caractere, inclusa in biblioteca string.h.
char sir[20],c_end;int nrcaractere;
cin.get(sir,nrcaractere,c_end);
Functia cin.get citeste un sir de caractere pana cand au fost citite nrcaractere-1 caractere sau pana sa intalnit caracterul c_end.
Parametrul c_end poate lipsi. Implicit acesta este \n (new line).
Pot fi citite si caracterele albe, caracterul nul este inserat automat iar caracterul transmis ca ultim
parametru nu este inserat in sir.
Exemple:
char sir[30]="informatica";
cin.get(sir,5,?);
//variabila sir va retine info
cin.get(sir,15,*);
//variabila sir va retine informatica
cin.get(sir,15,o);
//variabila sir va retine inf deoarece s-a intalnit caracterul 'o' pe a patra pozitie in
sir
cin.get(sir,4,c);
//variabila a va retine inf
cin.get(sir,15);
//variabila a va retine informatica
Functia cin.get( ) fara parametri are rolul de a citi un caracter.
Functia cin.get(char c) are rolul de a citi un caracter pe care il atribuie in variabilei c.
In cazul utilizarii repetate a functiei cin.get(sir,nr,c), dupa fiecare folosire trebuie citit caracterul de la
sfarsitul fiecarui sir, adica \n. In caz contrar, acest caracter va fi incarcat la inceputul urmatorului sir, a
carui citire se termina la caracterul Enter, 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 \n se realizeaza folosind cin.get() fara parametri.
Exemplu:
char sir1[20],sir2[30];
cin.get(sir1,15);
cin.get(sir2,10);
Daca se citeste pentru sir1='Colegiul" si pentru sir2="Titeica" se observa ca sir1=Colegiul" dar sir2=
(sirul vid)
Varianta corecta este:
cin.get(sir1,15);
cin.get();
cin.get(sir2,10);
Afisarea unui sir de caractere se face folosind cout.
cout<<sir;
Se poate afisa si caracter cu caracter, folosind o instructiune repetitiva, ca in cazul tablourilor, dar
aceasta varianta nu este recomandata.
Functia strlen: int strlen(nume_sir); returneaza lungimea efectiva a unui sir (fara a numara terminatorul de
sir).
Exemplu: char a[50]=ora de informatica;
strlen(a) = 18
Functia strcpy: strcpy(sir_destinatie,sir_sursa); copiaza sirul sir_ sursa in sir_destinatie (se simuleaza
atribuirea a=b insa
ATENTIE: Nu este permisa atribuirea intre doua siruri de caractere folosind operatorul =. Atribuirea se face
obligatoriu cu functia strcpy.
Exemplu:
char a[50]=primul sir,b[40]=al doilea sir;
strcpy(a,b);
a = al doilea sir; b=al doilea sir;
Functia strncat: strncat(dest,sursa,nr); adauga dest primele nr caractere din sirul sursa. Sirul sursa ramane
nemodificat.
Exemplu:
char *a=Colegiul,*b=Titeica?;
strncat(a,b,3);
a = Colegiul Tit;
Functia strrchr: strrchr(sir,c); are acelasi rol cu strchr, cu deosebirea ca returneaza adresa ultimei aparitii a
caracterului.
Cautarea se face de la dreapta spre stanga; r = right)
Functia strcmp: int strcmp(sir1,sir2); are rolul de a compara doua siruri de caractere.
Valoarea returnata este
<0 (daca sir1<sir2)
=0 (daca sir1=sir2)
>0 (daca sir1>sir2).
Observatii:
Functia strcmp face distinctie intre literele mari si cele mici ale alfabetului.
Functia strcmp returneaza diferenta dintre codurile ASCII ale primelor caractere care nu coincid
Functia stricmp: int stricmp(sir1,sir2); are acelasi rol cu strcmp, cu deosebirea ca nu face distinctie intre
literele mari si cele mici ale alfabetului
(i = ignore).
Functia strstr: strstr(sir1,sir2); are rolul de a identifica daca sirul sir2 este subsir al sirului sir1.
Daca este, functia returneaza adresa de inceput a subsirului sir2 in sirul sir1, altfel returneaza adresa 0.
In cazul in care sir2 apare de mai multe ori in sir1, se returneaza adresa de inceput a primei aparitii.
Cautarea se face de la stanga la dreapta
Functia strtok: strtok(sir1,sir2); are rolul de a separa sirul sir1 in mai multe siruri (cuvinte) separate intre ele
prin unul sau mai multe caractere cu rol de separator. Sirulsir2 este alcatuit din unul sau mai multe caractere cu
rol de separator.
Functia strtok actioneaza in felul urmator:
o
Primul apel trebuie sa fie de forma strtok(sir1,sir2); Functia intoarce adresa primului caracter al primei
entitati. Dupa prima entitate, separatorul este inlocuit automat prin caracterul nul.
o
Urmatoarele apeluri sunt de forma strtok(NULL,sir2); De fiecare data, functia intoarce adresa de inceput a
EXEMPLE
Exemplu: Se citeste de la tastatura un sir de caractere. Sa se afiseze cuvintele din sir. Cuvintele sunt despartite de
spatiu.
#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()
{char a[100],cuv[10][10],*p,separator[]=" ";
int i=0,nr=0;
cout<<"Dati sirul:";cin.get(a,100);
strcpy(p,a);
p=strtok(p,separator);
while (p)
{strcpy(cuv[++nr],p);
p=strtok(NULL,separator);}
cout<<"Sunt "<<nr<<" cuvinte:"<<endl;
for (i=1;i<=nr;i++) cout<<cuv[i]<<endl;
}
1. Se citesc de la tastatura 2 siruri de caractere. Sa se afiseze care sir este mai mare din punct de
vedere lexicografic.
#include<iostream.h>
#include<string.h>
void main()
{int i,n; char a[100],b[100];
cout<<"sir1=";cin>>a;
cout<<"sir2=";cin>>b;
n=strcmp(a,b);
if(n==0) cout<<"siruri egale";
else if(n<0) cout<<a<<">"<<b;
else cout<<b<<">"<<a;
}
2. Se citesc de la tastaura 2 siruri de caractere. Sa se verifice daca fara a face diferenta intre literele
mari si mici cele 2 siruri reprezinta acelasi sir. De exemplu: a="Abc" si b="AbC" => cele 2 siruri coincid
#include<iostream.h>
#include<string.h>
void main()
{int i,n; char a[100],b[100];
cout<<"sir1=";cin>>a;
cout<<"sir2=";cin>>b;
strupr(a);
strupr(b);
if(strlen(a)==strlen(b)) {
i=0;
while(i<strlen(a)&&a[i]==b[i]) i++;
if (i==strlen(a)) cout<<"da";
else cout<<"nu";
}
else cout<<"nu";
}
3. Sa se afiseze literele comune din 2 siruri de caractere (de pe aceiasi pozitie) fara a se face
distinctie intre literele mari si mici.
#include<iostream.h>
#include<string.h>
void main()
{int i,n; char a[100],b[100];
cout<<"sir1=";cin>>a;
cout<<"sir2=";cin>>b;
strupr(a);
strupr(b);
for(i=0;i<strlen(a);i++)
if(a[i]==b[i]) cout<<a[i];
cout<<a<<" "<<b;
}
5. Sa se verifice daca un sir indeplineste proprietatea de palindrom. De exemplu: a="assa" palindrom; b="assb" - nu e palindrom
#include<iostream.h>
#include<string.h>
void main()
{int j,i,n; char a[100],b[100],c[1];
cout<<"sir1=";cin.get(a,100);
n=strlen(a);
i=0;
j=n-1;
while(i<j && a[i]==a[j]) {i++;j--;}
if(i>=j)cout<<"da";
else cout<<"nu";
}
9. Se citeste un text caracter c. Sa se determine de cate ori se gaseste caracterul in text (nu se face
distinctie intre literele mari si literele mici).
#include<iostream.h>
#include<string.h>
void main()
{int c=0,i,n; char a[100],ch[1];
cout<<"dati sirul "; cin.get(a,100);
cout<<"dati caracterul ";cin>>ch;
strupr(ch);strupr(a);
for(i=0;i<strlen(a);i++)
if(a[i]==ch[0]) c++;
cout<<c;
}
}
}
}
void main()
{
citire();
afisare();
sortare();
afisare();
}
10
int max=strlen(a[1]);
for(int i=1;i<=n;i++)
if(strlen(a[i])>max) max=strlen(a[i]);
return max;
}
void sir_lungime_max()
{int max=lungime_maxima();
for (int i=1;i<=n;i++)
if(strlen(a[i])==max) puts(a[i]);
}
void main()
{
citire();
afisare();
sir_lungime_max();
}
12. Se citeste un cuvant. Sa se afiseze care sunt literele folosite in acest cuvant.
#include<string.h>
#include<iostream.h>
#include<stdio.h>
char a[30];
void main()
{char *este;
cout<<"dati sirul";gets(a);
strlwr(a);
for(char c='a';c<='z';c++)
{este=strchr(a,c);
if (este-a>=0) cout<<c;
}
}
11
14. Se citete un text ntr-o variabil de tip string, in care cuvintele se despart prin spaii. Se cere:
a)
b)
#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()
{
char text[100],*p, separator[]=" ", cuv[10][10], cuvant[10], aux[10] ; int nrv=0,voc, nr, k, i, j;
cout<<"Dati sirul:";cin.get(text,100);
strcpy(p,text) ;
p=strtok(p,separator) ;
while(p)
{
strcpy(cuv[++nr],p);
p=strtok(NULL,separator);
}
for(i=1;i<nr;i++)
12
for(j=i+1;j<=nr;j++)
if(strcmp(cuv[i],cuv[j])>0)
{
strcpy(aux,cuv[i]);
strcpy(cuv[i],cuv[j]);
strcpy(cuv[j],aux);
}
for(i=1;i<=nr;i++)
cout<<cuv[i];
for(i=1;i<=nr;i++)
{
voc=0;
strcpy(cuvant,cuv[i]);
k=strlen(cuvant) ;
for(j=0;j<k;j++)
{switch(cuvant[j])
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':{voc++; break;}
}}
if (voc>=4) nrv++ ;
}
cout<<nrv;
getch();
}
15. Se citete de la tastatur un cuvnt. S se afieze numrul iniial de caractere ale cuvntului i
apoi s se tearg toate vocalele din cuvnt.
13
#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()
{char cuvant[100]; int k,l,j,i;
cin>>cuvant;
k=strlen(cuvant) ;
for(j=0;j<k;j++)
{switch(cuvant[j])
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':{for(l=j;l<k;l++) cuvant[l]=cuvant[l+1];k--; break;}
}}
cout<<cuvant;}
14