Documente Academic
Documente Profesional
Documente Cultură
În acest articol
vom discuta despre șirurile de caractere reprezentate ca tablouri unidimensionale cu
elemente de tip char, reprezentare care provine din limbajul C.
char s[11];
S-a declarat un șir care poate memora maxim 11 caractere, cu indici 0 1 ... 10.
Șirul s poate memora cel mult 10 caractere utile, după ultimul caracter util fiind memorat
caracterul '\0'.
cin >> s;
1
Î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:
Se vor citi în șirul s caracterele din stream-ul de intrare (de la tastatură) până la apariția
caracterului sfârșit de linie '\n', dar nu mai mult de n-1 caractere. Caracterul '\n' nu
va fi adăugat la șirul s, dar va fi extras din stream. De exemplu:
cin.getline(s , 11);
#include <iostream>
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;
}
O altă modalitate de citire a unui șir care poate conține spații este folosirea
metodei get a obiectului istream, pe care nu o mai prezentăm aici.
char s[]="abac"; // sirul consta din 5 caractere: cele 4 litere si caracterul nul
'\0'
cout << s[3]; // c
2
s[1] = 'r';
cout << s; // arac
cout << s[10]; // ??? comportament impredictibil: nu exista in sir caracter cu
indice 10
În numeroase situații este necesară analizarea fiecărui caracter din șir. Pentru aceasta
este necesară o parcurgere a șirului; aceasta se face similar cu parcurgerea unui tablou
oarecare. Diferența constă în faptul că, pentru șirul de caractere nu se cunoaște explicit
lungimea. Ea poate fi determinată cu funcția strlen (vezi mai jos), dar putem controla
parcurgerea șirului știind că după ultimul caracter valid din șir apare caracterul nul '\0'.
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] << " ";
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.
3
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.
Iată un exemplu:
#include <iostream>
int main(){
char * p , s[]="pbinfo";
cout << s << endl; // pbinfo
p = s;
cout << p << endl; // pbinfo
p ++;
cout << p << endl; // binfo
return 0;
}
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
4
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
Verifică dacă un caracter este literă mică. Returnează o valoare diferită de zero dacă
parametrul este literă mică, 0 în caz contrar.
isupper
Verifică dacă un caracter este literă mare. Returnează o valoare diferită de zero dacă
parametrul este literă mare, 0 în caz contrar.
isdigit
Verifică dacă un caracter este cifră. Returnează o valoare diferită de zero dacă
parametrul este cifră, 0 în caz contrar.
tolower
Convertește parametrul la literă mică. Dacă parametrul este literă mare, returnează
valoarea convertită, în caz contrar returnează valoarea inițială a parametrului.
toupper
5
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ă.
Exemple:
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.
Exemple:
6
strcpy(s , t);
cout << s; // copil
strcpy(s , t + 2);
cout << s; // pil
strcpy(s + 2 , t);
cout << s; // picopil
strncpy
char *strncpy( char *dest, const char *src, std::size_t count );
Copiază cel mult count caractere din șirul aflat la adresa src, în șirul al cărui prim
element se află la adresa din dest.
Exemple:
char s[100]="abcdefghjkl";
strncpy(s, "poveste", 3);
cout << s; // povdefghjkl
strcat
char *strcat( char *dest, const char *src );
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.
Exemple:
7
char s[21]="pbinfo", t[21] = "copil";
strcat(s , t);
cout << s; // pbinfocopil
strcat(s , t + 2);
cout << s; // pbinfocopilpil
strchr
char *strchr( char * str, char ch );
Caută caracterul ch în șirul al cărui prim caracter se află în memorie la adresa din str.
Exemple:
char s[21]="pbinfo";
char * p = strchr(s , 'i');
cout << p; // info
char ch = 'i';
if(strchr("aeiou" , ch) != NULL)
cout << "DA"
else
cout << "NU";
//se va afisa DA
strstr
char *strstr( char * s, char * t );
Caută șirul t în șirul al cărui prim caracter se află în memorie la adresa din s.
Exemplu:
8
char s[21]="pbinfo";
char * p = strstr(s , "inf");
cout << p; // info
strcmp
int strcmp( char * s, char * t );
Exemplu:
strtok
char *strtok( char *str, const char *sep );
primul apel are ca parametri șirul din care se face extragerea și șirul separatorilor
la următoarele apeluri primul parametru este NULL.
9
Ș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.
10
//inserarea
strcpy(t , s + x);
strcpy(s + x + 1 , t);
s[x] = 'A'; // echivalent, *(s+x) = 'A';
11