Sunteți pe pagina 1din 14

Siruri de caractere

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 strcat: strcat(dest,sursa); adauga sirului dest sirul sursa.


Sirul sursa ramane nemodificat. Operatia se numeste concatenare si nu este comutativa.
Exemplu:
char *a=Colegiul ,*b=Titeica?;
strcat(a,b);
a = Colegiul Titeica?;

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 strchr: strchr(sir,c); are rolul de a cauta caracterul c in sirul sir.


Cautarea se face de la stanga la dreapta, iar functia intoarce adresa subsirului care incepe cu prima aparitie a
caracterului c. Daca nu este gasit caracterul, functia returneaza 0. Diferenta dintre adresa sirului initial si cea a
subsirului returnat reprezinta chiar pozitia caracterului cautat in sirul dat.
Exemplu:
char *a=acesta este un sir,b=t,c=x,d;
cout<<strchr(a,b); se tipareste ta este un sir;
cout<<strchr(a,c); nu se tipareste nimic (se tipareste 0 daca se face o conversie la int a lui strchr(a,c) ;
d= strchr(a,b);
cout<<Caracterul apare prima data la pozitia <<d-a;

Sa se afiseze toate pozitiile unui caracter intr-un sir


#include <iostream.h>
#include <string.h>
void main()
{char a[100],*p,c;
cin.get(a,100);
cin>>c;
p=strchr(a,c);
while (p)
{cout<<"Pozitia "<<p-a<<endl;
p++;
p=strchr(p,c);}
}

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

urmatoarei entitati, adaugand automat dupa ea caracterul nul.

Cand sirul nu mai contine entitati, functia returneaza adresa nula.

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];

4. Sa se interschime continutul a doua siruri de caractere.


#include<iostream.h>
#include<string.h>
void main()
{int i,n; char a[100],b[100],c[100];
cout<<"sir1=";cin.get(a,100);cin.get();
cout<<"sir2=";cin.get(b,100);
strcpy(c,a);
strcpy(a,b);
strcpy(b,c);

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";
}

6. Se citeste un sir de caractere de la tastatura. Sa se scrie sirul transformand majusculele in litere


mici.
#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);
strlwr(a);
cout<<a;}

7. Sa se determine frecventa de aparitie a unui caracter intr-un sir de caractere.


#include<iostream.h>
#include<string.h>
void main()

{int c=0,i,n; char a[100],ch;


cout<<"dati sirul "; cin.get(a,100);
cout<<"dati caracterul ";cin>>ch;
for(i=0;i<strlen(a);i++)
if(a[i]==ch) c++;
cout<<c;
}

8. Sa se genereze toate prefixele / sufixele unui cuvant. (vom afisa prefixele)


#include<iostream.h>
#include<string.h>
void main()
{int i,j,n; char a[100];
cout<<"dati sirul "; cin.get(a,100);
for(i=0;i<strlen(a);i++){
for(j=0;j<=i;j++)
cout<<a[j];
cout<<endl;
}
}

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;
}

10. Se citesc n siruri de caractere. Sa se afiseze sirurile in ordine lexicografica (crescator).


#include<string.h>
#include<iostream.h>
#include<stdio.h>
char a[100][30]; /*vector cu maxim 100 componente de tip sir de caractere*/
int n;
void citire()
{int i;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]=";gets(a[i]);
}
}
void afisare()
{for (int i=1;i<=n;i++)
puts(a[i]);
cout<<endl;
}
void sortare()
{int i,j,y;char x[30];
for(i=1;i<=n-1;i++)
for (j=i+1;j<=n;j++)
{y=strcmp(a[i],a[j]);
strcpy(x,"");
if(y>0){
strcpy(x,a[i]);
strcpy(a[i],a[j]);
strcpy(a[j],x);

}
}
}
void main()
{
citire();
afisare();
sortare();
afisare();
}

11. Se citesc de la tastatura maxim 30 de cuvinte. Sa se determine cuvintele de lungime maxima.


#include<string.h>
#include<iostream.h>
#include<stdio.h>
char a[30][30]; /*vector cu maxim 100 componente de tip sir de caractere*/
int n;
void citire()
{int i;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]=";gets(a[i]);
}
}
void afisare()
{for (int i=1;i<=n;i++)
puts(a[i]);
cout<<endl;
}
int lungime_maxima()
{

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

13. Se citeste de la tastaura un text. Sa se afiseze textul in ordine inversa.


#include<string.h>
#include<iostream.h>
#include<stdio.h>
char a[250];
void main()
{
cout<<"dati sirul";cin.get(a,250);
for(int i=strlen(a)-1;i>=0;i--)
cout<<a[i];
}

14. Se citete un text ntr-o variabil de tip string, in care cuvintele se despart prin spaii. Se cere:
a)

S se afieze cuvintele n ordine alfabetic;

b)

S se numere cuvintele cu minim 4 vocale distincte

#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

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