Documente Academic
Documente Profesional
Documente Cultură
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.)
#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;
}
1
Algoritmi și programare
Cursul nr. 6
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
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;
}
3
Algoritmi și programare
Cursul nr. 6
{
char a[100]="sirul 1",b[100]="sirul 2";
strcpy(a,b);
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;
}
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.
6
Algoritmi și programare
Cursul nr. 6
strcpy(s, s+lung);
s=strstr(s,s2);
}
cout<<s1;
return 0;
}
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.
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;
}
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;
}
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.
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.
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;
}
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