Sunteți pe pagina 1din 12

Algoritmi și programare

Cursul nr. 6

Şiruri de caractere

O constantă de tip șir de caractere se declară între două caractere “". Ea este reținută în memoria
internă sub formă de vector de caractere. Pentru fiecare caracter este reținut codul ASCII.
Lungimea unui șir de caractere este egală cu numarul de caractere plus 1, ultimul caracter din șir
fiind caracterul nul. (Ultimul octet va reține 0.)

Declararea șirurilor de caractere


Exemple:
char v[10]=“student";
char v[]=“student"; /*Calculatorul face calculul numărului de octeți
necesari.*/
char v[100]=“student" /*Am rezervat mai mulți octeți decât era
necesar.*/

Citirea/scrierea șirurilor de caractere

#include <iostream>
using namespace std;
int main()
{
char a[15];
int i;
for(i=0; i<10; i++)
cin>>a[i];
c[10]=0;
for(i=0; i<10; i++)
cout<<a[i];
return 0;
}

Caracterul nul este adăugat automat.


Se sar caracterele albe (spațiile). Exemplu: " Student" va fi memorat "Student".
Se citește primul caracter care nu este alb și citirea se sfârșește la întâlnirea caracterului alb.

1
Algoritmi și programare
Cursul nr. 6

cin.get(vector_de_caractere, int n [, char=caracter]);


Prototipul se află în fișierul <string.h>.
Se citește un șir de caractere până au fost citite n-1 caractere, sau a fost întâlnit ultimul caracter
dat ca parametru (implicit '\n').
cin.get() citește un caracter.
Exemple:
1) char a[10];
cin.get(a,10,'f');
cout<<a;
2) char s1[100], s2[25];
cout<<"sir1";
cin.get(s1,100);
cin.get();
cout<<"sir2";
cin.get(s2,25);
Dacă după prima citire nu ar fi folosit cin.get(); a doua citire nu ar mai fi fost efectuată.
Sfârșitul primului șir ar fi fost introdus prin apăsarea tastei ENTER și în memorie ar fi fost introdus
caracaterul '\n'. La a doua citire, noul șir va începe cu acesta. Utilizatorul nu va mai putea să
tasteze al doilea șir.

Tipul char*

Numărul de ordine al unui octet în memorie se numește adresa octetului respectiv. Adresa unui
vector de caractere este adresa primului său octet. O variabilă de tipul char* poate reține adresa unui
vector de caractere. În C++ numele unui vector de caractere este o adresă constantă de vector și poate fi
atribuit unei variabile de tip char*.
Exemplu
#include<iostream>
using namespace std;
int main()
{
char a[]="exemplu", *p;

2
Algoritmi și programare
Cursul nr. 6
p=a;
cout<<p<<endl;
p++;
cout<<p<<endl;
p++;
cout<<p<<endl;
cout<<p[1]<<endl;
cout<<p-a;
return 0;
}
Funcţii pentru lucrul cu şiruri de caractere

Prototipul acestor funcții este definit în <string.h>.

size_t strlen(char*);
Returnează lungimea efectivă a unui șir fără a considera și caracterul nul.
size_t este un tip întreg, utilizat în adresarea memoriei, definit în string.h și poate fi privit
ca tipul unsigned int.
Argumentul este de tip char*, adică un vector de caractere.
Exemplu:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{ char a[100];
cin.get(a,100);
cout<<"Sirul are "<<strlen(a)<<“ caractere";
return 0;
}

char* strcpy(char* destinaţie, char* sursă);


Copiază șirul de adresă sursă la adresa destinație.
Copierea se termină după ce a fost copiat caracterul nul.
Se returnează adresa destinație.
Exemplu:
#include<iostream>
#include<string.h>
using namespace std;
int main()

3
Algoritmi și programare
Cursul nr. 6
{
char a[100]="sirul 1",b[100]="sirul 2";
strcpy(a,b);
cout<<a;
return 0;
}

char* strcat(char* destinaţie, char* sursă);


Adaugă șirul de adresă sursă la șirul de adresă destinație.
Operația se numește concatenare și nu este comutativă.
Rezultatul este adresa șirului destinație, iar lungime sa va fi suma lungimilor celor două
șiruri.
Exemplu:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char a[15]="Ana", b[30]=" invata.";
strcat(a,b);
cout<<a;
return 0;
}

char* strncat(const char* destinaţie, const char* sursă, size_t n);


Adaugă primii n octeți din șirul de adresă sursă la șirul de adresă destinație.
Adăugarea se face înaintea carecterului nul.
Rezultatul este adresa șirului destinație.
Exemplu:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char a[15]="Ana", b[30]=" invata.";
strncat(a,b,3);
cout<<a;
return 0;
}

4
Algoritmi și programare
Cursul nr. 6
char* strchr(char* s, int c);
Caută caracterul c în șirul s. Căutarea se face de la stânga la dreapta. În cazul în care caracterul a
fost găsit, funcția întoarce subșirul care începe cu caracterul căutat și se termină cu caracterul nul
al șirului s. Altfel, întoarce o expresie de tip char* cu valoarea 0.
Exemplu:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char a[15]=“Studenti";
cout<<strchr(a,’t’); // Programul tipareste tudenti.
return 0;
}

char* strrchr(char* s, int c);


Caută caracterul c în șirul s de la dreapta la stânga.
Se returnează adresa ultimei apariții a caracterului în șir, sau întoarce o expresie de tip char* cu
valoarea 0.
Exemplu:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char a[15]="Studenti";
cout<<strrchr(a,'t'); // Programul tipareste ti.
return 0;
}

int strcmp (const char* s1, const char* s2);


Compară două șiruri de caractere. Funcția nu face distincție între litere mari și litere mici.
s1<s2 dacă s1 este în dicționar înaintea lui s2. Întoarce o valoare:
<0, dacă s1<s2;
=0, dacă s1=s2;
>0, dacă s1>s2.

5
Algoritmi și programare
Cursul nr. 6
int stricmp (const char* s1, const char* s2);

Compară două șiruri de caractere. Funcția nu face distincție între litere mari și litere mici.
s1<s2 dacă s1 este în dicționar inaintea lui s2. Întoarce o valoare
<0, dacă s1<s2;
=0, dacă s1=s2;
>0, dacă s1>s2.

char* strstr(char* s1, char* s2);


Identifică dacă șirul s2 este subșir al șirului s1. Căutarea se face de la stânga la dreapta.
În cazul în care șirul a fost găsit, funcția întoarce adresa de început a șirului s2 în șirul s1, altfel
returnează adresa 0. Dacă s2 apare de mai multe ori în s1, se returnează doar adresa primei apariții.
Exemplu:
#include<iostream.h>
#include<iostream>
#include<string.h>
using namespace std;
int main()
{char s1[150],s2[10],*s;
cout<<“s1=”; cin.get(s1,150);
cin.get();
cout<<“s2=”; cin.get(s2,10);
s=strstr(s1,s2);
if (s) cout<<“Este subsir de indice”<<s-s1;
else cout<<“Nu este subsir”;
return 0;
}

Exemplu: Ștergerea aparițiilor unui subșir într-un șir


#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char s1[150],s2[10],*s;
int lung;
cout<<“s1=”; cin.get(s1,150);
cin.get();
cout<<“s2=”; cin.get(s2,10);
lung=strlen(s2);
s=strstr(s1,s2);
while(s)
{

6
Algoritmi și programare
Cursul nr. 6
strcpy(s, s+lung);
s=strstr(s,s2);
}
cout<<s1;
return 0;
}

char* strrstr(char* s1, char* s2);

Identifică dacă șirul s2 este subșir al șirului s1, căutarea facându-se de la dreapta la stânga. În
cazul în care șirul a fost găsit, funcția întoarce adresa de început a ultimei apariții a șirului s2 în șirul s1,
altfel returnează adresa 0. Dacă s2 apare de mai multe ori în s1, se returnează doar adresa ultimei apariții.

size_t strspn(char* s1, char* s2);


Returnează numărul de caractere consecutive ale șirului s1, care încep obligatoriu cu primul
caracter, care se găsesc în șirul s2.
Exemplu: s1=“AB2fvd”, s2=“BCA32”
strspn(s1,s2) returnează 3, deoarece caracterele A, B și 2 din s1 se găsesc în
s2.

size_t strcspn(char* s1, char* s2);


Returnează numărul de caractere consecutive ale șirului s1, care încep obligatoriu cu primul
caracter, care nu se găsesc în șirul s2.
Exemplu: s1="AB2fvd", s2="BCA32"
strcspn(s1,s2) returnează 0, deoarece caracterul 'A' din s1 se găsește în s2.

Exemplu: Să se verifice dacă un șir care nu conține caractere albe este alcătuit doar din caractere
nenumeric
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char cuvant[200], cifre[]="0123456789";
cout<<"Introduceti cuvantul:";
cin.get(cuvant,200);
if(strcspn(cifre,cuvant)==10) cout <<"corect";
else cout<<"incorect";
return 0;
}

7
Algoritmi și programare
Cursul nr. 6
char* strtok(char* s1, char* s2);
Șirul s1 este considerat a fi alcătuit din mai multe cuvinte separate de mai multe caractere
cu rol de separator. La prima apelare a funcției de forma strtok(s1, s2) întoarce adresa
primului caracter al primului cuvânt. Separatorul de după primul cuvânt este înlocuit de caracterul
nul (cod 0). Următoarele apeluri ale funcției sunt de forma strtok(NULL,s2) și întoarce adresa
primului caracter al următorului cuvânt, adăugând caracterul nul după acesta. După ce s-au terminat
toate cuvintele, funcția întoarce adresa nulă.
Exemplu: Să se numere câte cuvinte sunt într-un text
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char* text, separator[]=" ,;:)(!?-", *p;
int nr=0;
cout<<"textul:";
cin.get(text,3000);
p=strtok(text,separator);
while(p)
{
nr++;
p=strtok(NULL,separator);
}
cout<<nr<<" cuvinte";
return 0;
}

char* strpbrk(char* s1, char* s2);


Caută primul caracter al șirului s1 în s2. Dacă este găsit returnează adresa sa din cadrul
șirului s1 și execuția se termină. Altfel trece la pasul următor. Caută al doilea caracter al șirului s1 în
s2. Dacă este găsit returnează adresa sa din cadrul șirului s1 și execuția se termină. Altfel trece la
pasul următor. Ș.a.m.d.
Dacă niciun caracter al șirului s1 nu aparține șirului s2, funcția returnează adresa nulă.
Exemplu: Să se afișeze toate caracterele dintr-un cuvânt care se găsesc în alt cuvant
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char cuvant1[15],cuvant2[15],*s;
cout<<“Introduceti primul cuvant:”;

8
Algoritmi și programare
Cursul nr. 6
cin>>cuvant1;
cout<<“Introduceti al doilea cuvant:”;
cin>>cuvant2;
s=strpbrk(cuvant1,cuvant2);
while(s)
{
cout<<s[0]<<endl;
s++;
s=strpbrk(s,cuvant2);
}
return 0;
}

char* strlwr(char* s);


Convertește literele mari în litere mici. Celelalte caractere ramân neschimbate.
Funcția întoarce adresa s.

char* strupr(char* s);


Convertește literele mici în litere mari. Celelalte caractere ramân neschimbate.
Funcția întoarce adresa s.

Conversia șirurilor de caractere


în valori numerice și invers

Prototipul acestor funcții se găsește în fișierul <stdlib.h>.

double atof (char *s)


Convertește un șir către o valoare de tip double. Dacă sunt întâlnite caractere nenumerice
și conversia eșuează se întoarce valoarea 0. Dacă primele caractere sunt albe, acestea sunt ignorate.

long double _atold (char *s)


Convertește un șir către o valoare de tip long double.

int atoi (char *s)


Convertește un șir către o valoare de tip int.

long atol (char *s)


Convertește un șir către o valoare de tip long.

char* ecvt(double valoare, int poz, int* zec, int* semn);


unde:
• valoare este valoarea de convertit;
• poz este numărul de poziții ocupate din șir;

9
Algoritmi și programare
Cursul nr. 6
• zec este adresa unei variabile de tip int care reține numărul zecimalelor pe care le are
numărul;
• semn este adresa unei variabile de tip int care are rolul de a memora după apel -1, dacă
numărul este negativ și 0 în caz contrar.
Observații:
1. Funcția nu returnează în șir nici punctul zecimal, nici semnul numărului.
2. Șirul obținut începe cu cifra cea mai semnificativă a numărului.
3. Pentru ca numărul obținut să fie corect este necesar să fie prelucrat de către programator.
4. Dacă numărul pozițiilor ocupate de șir (poz) este mai mare decât ocupă data, șirul este
completat la stânga cu caractere 0. Dacă numărul pozițiilor este mai mic decât cel ocupat
de număr, rezultatul este rotunjit.
Exemplu:
ecvt(val,3,&zec,&semn);
• Dacă val= 1234, se terurnează șirul “123”, zec=4 și semn=0.
• Dacă val= 1239, se returnează șirul “124”, zec=4 și semn=0.
• Dacă val= 1, se returnează șirul “100”, zec=1 și semn=0.
• Dacă val= -0.001, se returnează șirul “100”, zec=-3 și semn=1.

char* itoa(int valoare, char* sir, int baza)

Convertește o valoare de tip int într-un șir de caractere memorat în variabila sir.
Valoarea baza reține baza de numerație către care se face conversia (de obicei este baza 10). În
cazul bazei 10, se reține și eventualul semn.
Funcția întoarce adresa șirului obținut.

char* ltoa(long valoare, char* sir, int baza)


Convertește o valoare de tip long într-un șir de caractere memorat în variabila sir.

char* ultoa(unsigned long valoare, char* sir, int baza)


Convertește o valoare de tip unsigned long într-un șir de caractere memorat în variabila sir.

long strtol (char *sir, char** s, int baza);


Convertește un șir către o valoare de tip long.
Funcția are ca parametru adresa unei variabile de tip char* care va reține adresa primului caracter
care nu poate fi convertit. Astfel se pot depista eventualele erori de introducere a datelor.

10
Algoritmi și programare
Cursul nr. 6
Exemplu: Să se verifice dacă o valoare introdusă este numerică și dacă aparține intervalului
[10,25].
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
int main()
{
char numar[20],*adresa;
long v;
cout<<"numarul: "; cin>>numar;
v=strtol(numar,&adresa,10);
if(adresa-numar!=strlen(numar))
cout<<"Data contine caractere nenumerice";
else
if(v<10 || v>25)
cout<<"Data este numerica, dar nu apartine intervalului";
else cout<<v<<" este ok.";
return 0;
}

unsigned long strtoul (char *sir, char** s, int baza);


Convertește un șir către o valoare de tip unsigned long.

double strtod (char *sir, char** s);


Convertește un șir către o valoare de tip double.

long double _strtold (char *sir, char** s);


Convertește un șir către o valoare de tip long double.

Exemplu: Suma valorilor numerice care apar într-un text


#include<iostream>
#include<string.h>
using namespace std;
#include<stdlib.h>
int main()
{
char sir[1000];
char separator[]=" ";
char cifre[]="0123456789.+-";
char *s;
double suma=0;
cout<<"Introduceti textul: ";
cin.get(sir,1000);
s=strtok(sir,separator);
while(s)
{
if (strspn(s,cifre)==strlen(s))

11
Algoritmi și programare
Cursul nr. 6
suma+=atof(s);
s=strtok(NULL,separator);
}
cout<<"Suma numerelor intalnite in sir este "<<suma;
return 0;
}

12

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