Documente Academic
Documente Profesional
Documente Cultură
În C++ există mai multe modalități de a reprezenta șirurile de caractere. În acest articol
vom discuta despre șirurile de caractere reprezentate ca tablouri unidimensionale cu elemente de
tip char, reprezentare care provine din limbajul C.
Astfel, pentru reprezentarea în C/C++ a cuvântului copil, care are 5 caractere, se vor
folosi 6 octeți, cu valorile: 'c', 'o', 'p', 'i', 'l', '\0'.
S-a declarat un șir care poate memora maxim 10 caractere, cu indici 0 1 ... 10. Șirul s
poate memora cel mult 10 caractere utile, după ultimul caracter util fiind memorat caracterul '\0'.
Exemplu
char s[11] = "copil"; // se folosesc doar 6 caractere
În acest mod, datorită specificului operatorului >> nu se pot citi șiruri care conțin spații –
se vor citi caracterele până la primul spațiu, fără acesta.
Pentru a citi șiruri care conțin spații, putem folosi metoda getline a obiectului cin sau alt
obiect de tip istream:
De exemplu:
cin.getline(s , 11);
Am putea spune că getline citește toată linia și sare peste ENTER. Iată un exemplu complet:
#include <iostream>
#include<conio.h>
using namespace std;
int main()
{
char nume1[31], nume2[31];
cout << "Cum te cheama? (nume, prenume) ";
cin.getline(nume1, 31);
cout << "Cum il cheama pe prietenule tau? ";
cin.getline(nume2 , 31);
cout << "Te numesti " << nume1 << endl;
cout << "Esti prieten cu " << nume2 << endl;
return 0;
}
Următoarele exemple parcurg un sir de caractere și afișează caracterele separate prin spații:
char s[11];
cin >> s; // se citeste un cuvant , fara spatii
int i = 0;
while(s[i] != '\0')
{
cout << s[i] << " ";
i ++;
}
char s[11];
cin >> s; // se citeste un cuvant , fara spatii
for(int i = 0 ; s[i] ; i ++)
cout << s[i] << " ";
Considerăm declarația:
Ce este p? Este un pointer la char, adică o variabilă a cărei valoare este adresa unei date
de tip char. Întrebarea este a cărei date? În acest moment a niciuneia, deoarece variabila p nu a
fost inițializată, iar valoare ei este o adresă aleatorie. Șansele ca ea să reprezinte adresa unei date
de tip char din spațiul de memorie al programului nostru sunt la fel de mici ca șansele ca
valoarea inițială a unei variabile de tip int să fie în intervalul 1 ... 100.
Ce este s? Spunem că este un șir de caractere, dar practic s este tot un pointer. Valoarea
sa este adresa primului element din șir, adică adresa lui s[0]. Observăm că de fapt, variabilele p și
s sunt de același tip, pointer la char. Diferența dintre cele două variabile este că s memorează o
adresa de memorie unde începe un șir de caractere (la acea adresă există o dată de tip char ) în
timp ce p memorează o adresă aleatorie.
Cu ce putem inițializa pointer-ul p? Cu adresa unei date de tip char. O asemenea dată este
un orice element al unui șir de caractere, de exemplu orice element din s. Dacă p reprezinta
adresa unui caracter dintr-un șir, atunci cu p se pot face toate operațiile care se pot face cu acel
șir.
Iată un exemplu:
#include <iostream>
#include<conio.h>
using namespace std;
int main()
{
char * p , s[]="pbinfo";
cout << s << endl; // pbinfo
p = s;
cout << p << endl; // pbinfo
p ++;
cout << p << endl; // binfo
return 0;
}
Următoarele funcții au ca parametri valori numerice, reprezentând codul ASCII al unor caractere.
Prototipul lor se află în header-ul cctype.
isalnum
int isalnum( int ch );
Verifică dacă un caracter este alfanumeric (cifră, literă mare, literă mică). Returnează o valoare
diferită de zero dacă parametrul este alfanumeric, 0 în caz contrar.
isalpha
int isalpha( int ch );
Verifică dacă un caracter este alfabetic (literă mare, literă mică). Returnează o valoare diferită de
zero dacă parametrul este alfabetic, 0 în caz contrar.
islower
int isupper( int ch );
Verifică dacă un caracter este literă mică. Returnează o valoare diferită de zero dacă parametrul
este literă mică, 0 în caz contrar.
isupper
int isupper( int ch );
Verifică dacă un caracter este literă mare. Returnează o valoare diferită de zero dacă parametrul
este literă mare, 0 în caz contrar.
isdigit
int isdigit( int ch );
Verifică dacă un caracter este cifră. Returnează o valoare diferită de zero dacă parametrul este
cifră, 0 în caz contrar.
tolower
int tolower( int ch );
Convertește parametrul la literă mică. Dacă parametrul este literă mare, returnează valoarea
convertită, în caz contrar returnează valoarea inițială a parametrului.
toupper
int toupper( int ch );
Convertește parametrul la literă mare. Dacă parametrul este literă mică, returnează valoarea
convertită, în caz contrar returnează valoarea inițială a parametrului.
strlen
std::size_t strlen( const char* str );
Returnează lungimea șirului str, adică numărul de caractere din șirul al cărui prim caracter se află
la adresa memorată în str. Caracterul nul nu se numără.
permite aflarea lungimii exacte a unui sir de caractere (exceptannd caracterul NULL).
Exemplu
1.cout << strlen("pbinfo"); // 6
2.char s[10]="copil";
3.cout << strlen(s); // 5
4.cout << strlen(s + 2); //3
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int l;
char c[100];
cout<<"Introduceti sirul de caractere: ";
cin.get(c,99);
l=strlen(c);
cout<<"Lungimea sirului de caractere este: "<<l<<endl;
}
strcpy
char* strcpy( char* dest, const char* src );
Copiază caracterele din șirul aflat la adresa src, inclusiv caracterul nul, în șirul al cărui prim
element se află la adresa din dest.
Comportamentul acestei funcții este nedefinit dacă șirurile de la adresele dest și src se
suprapun.
Exemple:
char s[21], t[21] = "copil";
strcpy(s , "pbinfo");
strcpy(s , t);
strcpy(s , t + 2);
strcpy(s + 2 , t);
strncpy
Copiază cel mult count caractere din șirul aflat la adresa src, în șirul al cărui prim element se află
la adresa din dest.
În șirul dest nu se va plasa caracterul nul după cele count caractere copiate.
Comportamentul acestei funcții este nedefinit dacă șirurile de la adresele dest și src se
suprapun.
Exemple:
1.char s[100]="abcdefghjkl";
strcat
Adaugă (concatenează) caracterele din șirul aflat la adresa src, inclusiv caracterul nul, la șirul al
cărui prim element se află la adresa din dest.
Comportamentul acestei funcții este nedefinit dacă șirurile de la adresele dest și src se
suprapun.
Sintaxa:
strcat(sir1, sir2) - adauga sirul sir2 la sirul sir1 - al doilea sir ramane neschimbat.
Exemple:
1.char s[21]="pbinfo", t[21] = "copil";
2.strcat(s , t);
4.strcat(s , t + 2);
#include <iostream>
#include <string.h>
cin.get(sir1,99);
cin.get(sir2,99);
strcat(sir1,sir2);
strchr
Caută caracterul ch în șirul al cărui prim caracter se află în memorie la adresa din str.
Funcția returnează adresa NULL, dacă caracterul ch nu apare în șirul str, respectiva adresa
primei apariții al lui ch în str, dacă ch apare în str.
Exemple:
1.char s[21]="pbinfo";
2.char * p = strchr(s , 'i');
1.char ch = 'i';
4.else
6.//se va afisa DA
strstr
Caută șirul t în șirul al cărui prim caracter se află în memorie la adresa din s.
Funcția returnează adresa NULL, dacă șirul t nu apare în șirul s, respectiva adresa primei apariții
al lui t în s, dacă t apare în s.
Exemplu:
1.char s[21]="pbinfo";
strcmp
Standardul C/C++ stabilește doar semnul rezultatului, nu și valoarea acestuia. Valorile returnate
pot fi, dar nu trebuie să fie, -1 0 1.
Exemplu:
1.char s[21]="abur", t[21]="abecedar";
2.if(strcmp(s , t) < 0)
4.else
strtok
Funcția strtok extrage dintr-un sir de caractere câte un subșir (cuvânt) delimitat de caractere din
șirul sep. Funcția se apelează în două moduri:
primul apel are ca parametri șirul din care se face extragerea și șirul separatorilor
la următoarele apeluri primul parametru este NULL.
Rezultatul funcției strtok este adresa de început a subșirului curent extras, sau NULL dacă nu se
mai poate extrage niciun subșir din șirul dat.
Șirul din care se face extragerea se modifică în urma apelurilor. Dacă este nevoie de el mai târziu
trebuie să-i facem o copie.
Exemplu
Secvența de mai jos extrage dintr-un șir s cuvintele (separate prin caractere din mulțimea {' ', ',',
'.'}) și le afișează pe linii diferite. Șirul s se presupune declarat și citit.
3.while(p != NULL)
4.{
7.}
Acestea sunt operații frecvente și pot fi realizate cu ajutorul funcției strcpy. Deoarece
comportamentul funcției strcpy este impredictibil dacă parametri se suprapun, este necesară
utilizarea unui șir suplimentar.
ADICA,
cin
cin.get
strlen
strupr
strcat
strcpy
strcmp
strchr
strstr
strrev
EXEMPLU
#include <iostream>
using namespace std;
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 introdus este: "<<c;
}
#include <iostream>
using namespace std;
int main()
{
char c[10];
cout<<"Introduceti sirul de caractere: "<<endl;
cin>>c;
cout<<"Sirul de caractere introdus este: "<<c;
}
cin.get(s,n+1,'c')
unde:
o s - reprezinta sirul de caractere
o n+1 - lungimea sirului de caractere, care include si caracterul NULL
o c - caracterul care va determina incheierea introducerii de caractere in sir
Exemplul
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char c[100];
cout<<"Introduceti sirul de caractere: "<<endl;
cin.get(c,5,'x');
cout<<"Sirul de caractere introdus este: "<<c;
}
cin.get(s,n+1)
unde:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char c[100];
cout<<"Introduceti sirul de caractere: "<<endl;
cin.get(c,99);
cout<<"Sirul de caractere introdus este: "<<c;
}
In unele probleme este necesar sa se citeasca mai multe siruri de caractere folosind variabile
diferite. In cazul in care se foloseste functia cin.get, acest lucru nu este posibil decat daca intre
operatiile de introducere a sirurilor de caractere se apeleaza functia cin.get fara nici un
parametru:
cin.get()
http://tys.ro/programare/cpp/siruri.html