Sunteți pe pagina 1din 22

MARA-SÂNZIANA ALBU VICTOR BOTNARU RAMONA RĂDULESCU

MEMORATOR

Șiruri de
caractere
C++

CONSTANȚA

2020
2
3

CUPRINS
!! de editat !!
Determinarea lungimii unui șir de caractere

Copierea unui șir în alt șir

Concatenarea a două șiruri

Căutarea într-un șir

Compararea a două șiruri

Inversarea unui șir

Transformarea literelor mici din șir în litere mari și vic-


versa

Separarea entităților
4

ȘIRURI DE CARACTERE ÎN C++

Ș irurile de caractere sunt, de fapt, succesiuni de caractere.


Un șir de caractere este un tip special de tablou unidimensional, al
că rui ultim caracter este întotdeauna NULL.

Ce este un caracter?
Un caracter reprezintă un simbol, de exemplu o literă sau un numă r.
O constantă caracter are ca valoare codul ASCII al simbolului pe care îl
prezintă .
ASCII este acronimul pentru American Standard Code for Information
Interchange (codul standard american pentru schimbul de informații).
Acesta reprezintă un sistem de codificare a simbolurilor care se bazează
pe alfabetul englez. Codurile ASCII reprezintă caractere text pentru
computere și echipamente care lucrează cu text.

Caracterele au urmă toarele proprietă ți:


 Fiecă rui caracter îi corespunde o valoare întreagă distinctă
 Valorile ordinale ale cifrelor sunt ordonate și consecutive (’0’-48,
’1’-49 etc.)
 Valorile ordinale ale literelor mari sunt ordonate și consecutive
(’A’-66, ’B’-67 etc.)
 Valorile ordinale ale literelor mici sunt ordonate și
consecutive(’a’-97, ’b’-98 etc.)
Pentru a determina codul ASCII al unui caracter putem proceda astfel:

int n;
char c;
cout<<"caracterul: ";cin>>c;
n=c; //copiem codul ASCII al caracterului c în
variabila întreagă n
cout<<"codul: "<<n;
5

Reține! Caracterele se scriu între apostrofuri, iar ș irurile de


caractere între ghilimele.
Ex:
a ->variabilă
‘a’ ->caracter
123 -> numă r întreg
“123” ->ș ir de caractere (se foloseș te la afiș area unui ș ir de
caractere/mesaj, precum “da”, “nu”, “Hello World!” etc.)
6

Inițializarea șirurilor de caractere

Există mai multe modalită ți de a inițializa un șir de caractere:

Tipul char
1. char cuv[dimensiune];

Ș irul urmează sa fie citit de la tastatura/din fișier. În acest caz există


posibilitatea de a ră mâ ne octeți nefolosiți, dacă șirul citit este mai mic
decâ t dimensiunea alocată.

2. char cuv[17]=”informatica”;

Ș irul este gata inițializat, deci nu mai trebuie citit de la tastatură .


În acest caz, ca și mai sus, ră mâ n octeți nefolosiți. Am memorat un
vector de 17 octeți, din care 5 octeți ră mâ n neutilizați.

3. char cuv[]=”informatica”

În urma inițializă rii, la sfâ rșitul cuvâ ntului va fi adă ugat caracterul
0(codul ASCII al caracterului NULL).

Compilatorul va calcula numă rul de octeți necesari pentru memorarea


șirului. În acest caz, tabloul va conține 12 octeți:

 11 pentru memorarea șirului


 1 pentru memorarea codului caracterului NULL.

În acest caz, nu vor ră mâ ne octeți nefolosiți.


7

Tipul char*
Tipul char* poartă numele de pointer la caracter. O variabilă de
acest tip este capabilă de a reține adresa de memorie a unui caracter.

Obs! Numele unei variabile de tip șir de caractere reprezintă adresa


de memorie a primului octet al șirului.

Datorită acestui fapt, elementele unui șir de caractere pot fi accesate


prin intermediul adreselor lor. De exemplu:

Declară m și inițializă m o variabilă de tip șir de caractere:

char sir[]=”calculator”. Ce va fi afișat?

cout<<sir; va afișa șirul calculator, adică am adresat șirul începâ nd


cu primul octet.

cout<<sir+1; va afișa șirul alculator, adică am adresat șirul începâ nd


cu al doilea octet, și așa mai departe.

Fiind un vector, putem adresa șirul de caractere pe componente.


De exemplu sir[0]=’c’, sir[1]=’a’, ș.a.m.d.
8

#include <iostream>

using namespace std;


char sir[15],*p;
ifstream in("sir.in");
ofstream out("sir.out");
int main()
{cin>>sir;
cout<<"sir: "<<sir<<'\n';
cout<<"sir+1: "<<(sir+1)<<'\n';
cout<<"sir+2: "<<(sir+2)<<'\n';
cout<<"sir+3: "<<(sir+3)<<'\n';
cout<<'\n';

cout<<"(sir)[0]: "<<(sir)[0]<<'\n';
cout<<"(sir+1)[0]: "<<(sir+1)[0]<<'\n';
cout<<"(sir+1)[1]: "<<(sir+1)[1]<<'\n';
cout<<"(sir+1)[2]: "<<(sir+1)[2]<<'\n';
cout<<"(sir+2)[0]: "<<(sir+2)[0]<<'\n';
cout<<"(sir+2)[1]: "<<(sir+2)[1]<<'\n';
cout<<'\n';

p=sir+3;
cout<<"sir+3="<<p<<'\n';
p++;
cout<<"sir+3="<<p<<'\n';

return 0;
}
9

Introducerea (citirea) șirurilor de caractere

1) Introducerea șirului de caractere folosind


funcția de citire cin
Ș irul de caractere poate fi citit ca
a)
orice tablou, folosind funcția cin,
#include <iostream> dar caracterul NULL trebuie
using namespace std; adă ugat manual la sfâ rșitul șirului.
int main()
{int i;
char c[10];
cout<<"introduceti sirul de caractere: "<<endl;
for(i=0;i<7;i++)
cin>>c[i];
c[7]=0;
cout<<"sirul de caractere este: "<<c;

return 0;
}

Dezavantajul acestui mod de


citire este că nu sunt luate în
considerare spațiile dintre
caractere.
10

b) Tot folosind funcția cin,


putem citi șirul introducâ nd
#include <iostream> caracterele unul după altul. În
Using namespace std;
acest caz, caracterul NULL va
int main()
{ fi adă ugat automat.
char c[10];
cout<<"introduceti sirul de caractere: "<<endl;
cin>>c;
cout<<"sirul de caractere introdus este: ";
cout<<c;
return 0;
}

Obs! Vor fi luate în considerare


doar caracterele introduse pâ nă la
întâ lnirea primului spațiu.
11

2) Introducerea șirului de caractere folosind


funcția de citire cin.get

Pentru a putea folosi funcția cin.get este nevoie să fie implementată


biblioteca cstring.

a) Varianta cu 3 parametri
cin.get(sir, dimens+1,’c’) sir – ș irul de caractere
dimens+1 – lungimea maximă a
ș irului de caractere, inclusiv
caracterul NULL
c – caracterul care determină
încheierea citirii ș irului

#include <iostream> Obs!


#include <cstring>
using namespace std;  Dacă lungimea șirului introdus
este mai mare decâ t lungimea
int main()
{char c[101]; declarată, atunci șirul va fi
cout<<"Introduceti sirul trunchiat
de caractere: "<<endl;  Șirul memorează toate caractere,
cin.get(c,100,'x');
cout<<"Sirul de caractere inclusiv caracterele speciale
introdus este: "<<c; (spațiul)

return 0;}
12

b) Varianta cu 2 parametri
cin.get(sir, dimens+1) sir – ș irul de caractere
dimens+1 – lungimea maximă a ș irului de
caractere, inclusiv caracterul NULL

int main()
{char c[101];
cout<<"Introduceti sirul de caractere: "<<endl;
cin.get(c,100);
cout<<"Sirul de caractere Varianta aceasta implică folosirea
introdus este: "<<c; caracterului ENTER drept caracter
return 0; terminal al șirului.
}
Toate observațiile de mai sus sunt
valabile.

c) Varianta fără parametri


cin.get()
int main()
{char c1[101],c2[101];
cout<<"Primul sir: "<<endl;
cin.get(c1,100);
cout<<"Sirul este: "<<c1<<endl;
cin.get();
cout<<"Al doilea sir: "<<endl;
cin.get(c2,100);
cout<<"Sirul este: "<<c2;
return 0;
}
În cazul folosirii funcției cin.get,
pentru a putea citi mai multe șiruri
este necesară apelarea funcției fă ră
niciun parametru între operațiile de
introducere a șirurilor.
13

Funcții care operează cu șiruri de caractere

Ș irurile de caractere sunt, de fapt, tablouri unidimensionale, așa


că nu acceptă atribuiri de forma s1=s2. Pentru a efectua astfel de operații,
dar și altele, se folosesc funcții care operează cu șiruri de caractere.

Pentru a putea folosi aceste funcții, trebuie implementată


biblioteca cstring.

Determinarea lungimii unui șir de caractere


strlen(const) const – de tip char/string
#include <iostream>
#include <cstring>
using namespace std;

int main()
{char sir[50];
cin>>sir;
cout<<strlen(sir); // afiseaza lungimea sirului

return 0;
}

Copierea unui șir în alt șir


strcpy(dest, sursa) dest ș i sursa – de tip char/string
int main()
{char s2[20],s1[20];
cin>>s1;
strcpy(s2,s1); //copiaza s1 in s2
cout<<s2;

return 0;
}
14

Concatenarea a două șiruri

a) strcat
strcat(dest, sursa) dest și sursa – de tip
char/string
int main() Funcția strcat adaugă la sfâ rșitul
{ șirului dest o copie a șirului
char s1[50],s2[50]; sursa.
cout<<"introduceti s1: ";
cin>>s1;
cout<<"introduceti s2: ";
cin>>s2;
strcat(s1,s2); //concateneaza s2 la s1
cout<<s1;
return 0; Obs! Lungimea lui s1 devine
} strlen(s1)+strlen(s2).

b) strncat
strcpy(dest, sursa,nr) dest ș i sursa – de tip char/string;
nr – de tip int/long
int main()
{char s2[20],s1[20];
int n;
cin>>s1; cin>>n;
strcpy(s2,s1,n); //concateneaza primele n caractere
din s1 la s2
cout<<s2;
Funcția strncat adaugă la sfâ rșitul
return 0;
șirului dest cel mult nr elemente
}
din șirul sursa.

Obs! Lungimea lui s1 devine


strlen(s1)+nr.
15

Căutarea într-un șir Funcția strchar returnează prima


apariție, de la stâ nga la dreapta, a
a) strchr caracterului character în șirul sir.

strchr(sir, caracter) sir ș i caracter – de tip char/string


int main()
{char s[50],*p,c;
cout<<"introduceti sir: ";
cin>>s;
cout<<"introduceti caracterul cautat: ";
cin>>c;
p=strchr(sir,c); //cauta prima aparitie a
caracterului c in sir
if(p)
cout<<c<<" se gaseste pe pozitia "<<p<<" in
sir";
else
cout<<c<<" nu se gaseste in sir"; Obs! Caracterul nul este
return 0; considerat parte din șir.
}
b) strrchr
Are același rol ca funcția strchr, dar căutarea se face de
la dreapta spre stâ nga.

c) strstr
strstr(sir, secv) sir ș i secv – de tip char/string
int main()
{ char s1[20],s2[20],*p;
cout<<"introduceti primul sir: "; cin>>s1;
cout<<"introduceti al doile sir: "; cin>>s2;
p=strstr(s1,s2);
if(p)
cout<<s2<<" se gaseste pe pozitia "<<p<<" in
sir";
else
cout<<s2<<" nu se gasteste in s1";
return 0;}
Funcția strstr returnează prima
apariție, de la dreapta la stâ nga, a
secvenței secv în șirul sir.
16

Compararea a două șiruri

a) strcmp
strcpy(sir1, sir2) sir1 și sir2 – de tip
char/string
int main() Funcția strcpy compară șirul sir1 cu șirul
{char s1[10],s2[10];
int c;
sir2 începâ nd de la primul caracter al
cin>>s1; fiecă rui șir, pâ nă câ nd este gă sit un caracter
cin>>s2; diferit sau pâ nă câ nd unul dintre șiruri se
c=strcmp(s1,s2); termină .
if(c<0)
cout<<s1<<" < "<<s2;
else if(c>0)
Obs! Funcția compară codurile
cout<<s1<<" > "<<s2;
else ASCII ale caracterelor. Un
cout<<s1<<" = "<<s2; caracter este mai mic decâ t
altul dacă are codul ASCII
return 0;
} mai mic.

Valoarea returnată :
 <0, dacă s1<s2
 >0, dacă s1>s2
 =0,dacă s1=s2

b) strncmp

strncpy(sir1, sir2,nr) sir1 ș i sir2 – de tip char/string


nr – de tip int

Are același rol ca funcția strcmp, dar compararea se


face intre primele maxim nr caractere din ambele
șiruri.
17

Inversarea unui șir


strrev(sir) sir – de tip char/string
int main()
{char s[11];
cin>>s;
cout<<strrev(s)<<’\n’; //afiseaza inversul lui s
inv=strrev(s); //inv ia valoarea lui s citit in
ordine inversa
cout<<inv;

return 0;
}

Transformarea literelor mici din șir în litere mari


strupr(sir) sir – de tip char/string
int main()
{char s[11];
cin>>s;
strupr(s); //transforma toate literele mici in
majuscule
cout<<"Noul sir este: "<<s;

return 0;}

Transformarea literelor mari din șir în litere mici


strlwr(sir) sir – de tip char/string
int main()
{char s[11];
cin>>s;
strlwr(s); //transforma toate majusculele in
litere mici
cout<<"Noul sir este: "<<s;

return 0;}
18

Separarea entităților
strtok(sir,const) const si sir – de tip char/string
#include <iostream>
#include <cstring>
using namespace std;
char text[151],*p,separator[]=" .,;:";
int k=0;
int main()
{
cout<<"Introduceti textul: "<<endl;
cin.get(text,150);

p=strtok(text,separator); //determina prima


entitate
while(p)
{
k++;
cout<<p<<endl;
p=strtok(NULL,separator); //determina
urmatoarele entitati
}
cout<<endl<<"Nr de cuvinte este "<<k;

return 0;
}
19

Aplicații și probleme propuse

1) Se consideră șirul sir de maxim 40 de caractere. Să se determine


dacă șirul este un cuvâ nt palindrom.
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
char a[50],b[50];
cout<<"cuvantul este: ";
cin>>a;
int i,j=0;
for(i=strlen(a)-1; i>=0; i--)
{
b[j]=a[i];
j++;
}
b[j]=0; //adaug caracterul null la sfarsitul sirului

if(strcmp(a,b)==0)
cout<<"da";
else
cout<<"nu";
return 0;
}
20

2) Se dau de la tastatură numele a doi elevi (maximum 40 de


caractere). Să se afișeze numele în ordine alfabetică , pe linii
diferite.
#include <iostream>
#include <cstring>
using namespace std;

char a[41],b[41];
int main()
{
cin.get(a,40,'\n');
cin.get();
cin.get(b,40,'\n');
if(strcmp(a,b)>0)
{
cout<<b<<'\n';
cout<<a;
}
else
{
cout<<a<<'\n';
cout<<b;
}
return 0;
}
21

3) Se citesc de la tastatură două șiruri de caractere, s1 și s2. Să se


elimine toate aparițiile lui s2 din s1. Ș irul s1 este un text, iar șirul
s2 este un cuvâ nt.
#include <iostream>
#include <cstring>
using namespace std;

char s1[131],s2[20],*p;
int l;
int main()
{
cout<<"Din textul: ";
cin.get(s1,130);
cin.get();
cout<<"eliminan: ";
cin>>s2;
l=strlen(s2); //lungimea lui s1
p=strstr(s1,s2); //cautam s1 in s2
while(p)
{
strcpy(p,p+l); //sterge sirul s2, copiind sirul de pe pozitia
p+l pe pozitia p
p=strstr(s1,s2); //cautam o noua aparitie a lui s2 in s1
}
cout<<s1;
return 0;
}
22

4) Se citeș te un ș ir text ș i două ș iruri mai scurte, cuvinte, c1


ș i c2. Să se înlocuiască toate aparitiile lui c1 cu c2.
#include <iostream>
#include <cstring>
using namespace std;

char text[131],text1[131]="",c1[21],c2[21],*p; //text1 sir vid


int l;
int main()
{
cout<<"In textul ";
cin.get(text,130);
cout<<"inlocuim cuvantul ";
cin>>c1;
cout<<"cu ";
cin>>c2;
l=strlen(c1);
p=strstr(text,c1);
while(p)
{
strncat(text1,text,p-text); //concatenam la sirul text1 p-
text caractere
strcat(text1,c2); //concatenam c2 la text1
strcat(text1,p+l); //concatenam la text1 sirul de dupa c1
strcpy(text,text1); //copiem text1 in text
strcpy(text1,""); //sirul text1 devine vid dinnou
p=strstr(text,c1); //cautam urmatoarea aparitie in text a
lui c1
}
cout<<text;

return 0;
}

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