0% au considerat acest document util (0 voturi)
72 vizualizări7 pagini

Stringuri C++

Încărcat de

Rares M.
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
72 vizualizări7 pagini

Stringuri C++

Încărcat de

Rares M.
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

Siruri de caractere - Introducere

Prof. Bogdan FODOR, C. N. Andrei Saguna Brasov


November 8, 2024

Tipul char
Tipul de date char este un tip intreg cu reprezentare pe 8 biti cu semn, putand memora valori
pozitive intre 0 si 127, si corspondetii lor negativi. Fiecare astfel de valoare are asociat prin
intermediul codului ASCII(American Standard Code for Information Interchange) un carac-
ter(simbol grafic).

Caracterele cu coduri cuprinse intre 0 si 32 sunt caractere albe(caractere care nu au un


corespondent grafic vizibil), iar dintre aceastea este important de mentionat caracterul cu codul
ASCII 0(caracterul \0), care reprezinta caracterul final de string. Cifrele au coduri ASCII
cuprinse intre 48(’0’) si 57(’9’), litere mari intre 65(’A’) si 91(’Z’) iar literele mari intre 97(’a’)
si 122(’z’).
Observam deci ca diferenta dintre caracterul ’A’ - ’a’ este de 32, valoare ce va fi utila pentru
a transforma din majuscula in litera mica si invers.
La initializarea unei variabile de tip char, caracterul ce se da ca valoare initiala va fi specificat
intre apostrofi.

1
Siruri de caractere
Un vector ale carui elemente sunt caractere va fi denumit in continuare string. Acestea sunt
tablouri cu indexare de la 0 si pentru care ultimul caracter este obligatoriu caracterul NULL,
fiind astfel necesar sa alocam cel putin un spatiu suplimentar de memorie.

s[0] s[1] s[2] s[3] s[4] s[5]


c a r t e ’\0’

Afisarea unui sir de caractere se poate face fie caracter cu caracater, fie folosind o singura
intructiune cout care va afisa tot continutul stringului, pana la intalnirea caracterului NULL.
Daca un string contine mai multe caractere NULL, tot ce se afla dupa primul caracter NULL
va fi ignorat.

2
Pentru citire avem 3 optiuni. Citirea folosind instructiunea cin, ca pentru o variabila simpla,
va conduce la citirea tuturor caracterelor pana la intalnirea primului caracter alb(spatiu,enter,etc..).
Folosim aceasta varianta atunci cand avem de citit un singur cuvant sau un text ce nu contine
caractere albe.

Metodele get() si getline() ale obiectului cin primesc ambele cate 2 parametri, primul fiind
sirul de caractere in care sa se faca citirea iar al doilea un numar pozitiv, reprezentand numarul
maxim de caractere ce vor fi citite. Diferenta apare la citirea unui text aflat pe mai multe
linii. Ambele functii citesc o linie intreaga(inclusiv caracterele spatiu) insa [Link]() se opreste
la intalnirea caracterului ”(corespondentului lui endl) fara a-l citi si pe acesta, in timp ce
[Link]() se va opri la intalnirea caracterului ”, pe care il va citi fara a-l memora in string.

Atentie la cazul in care citim atat numere cat si text, pentru ca daca pe o linie avem numere,
iar pe linia urmatoare avem de citit text, este nevoie ca acel caracter ” de la finalul liniei cu
numere sa fie citit inainte de a trece la citirea textului. Astfel, introducem o instrunctiune
[Link]() fara parametri, cu rolul de a ”citi” caracterul ” fara a-l memora.

Aritmetica pointerilor
Tipul char* reprezinta un pointer catre o variabila de tip char. Pointerii sunt variabile care
memoreaza adrese de memorie

char s[15],*p;

Declaratia de mai sus contine un sir de caractere, s de dimensiune 15, si o variabila pointer,
p. In acest moment p este neinitializat. In realitate desi s este declarat ca un sir, si el este

3
tot un pointer, catre adresa primului sau element(s[0]), deci variabilele s si p sunt, in fapt,
variabile de acelasi tip, cu diferenta ca s memoreaza adresa unde incepe un sir de caractere iar
p memoreaza o adresa aleatorie.
Initializarea unui pointer se poate face prin atribuiea unei adrese a unei date de tip char,
aceasta fiind adresa oricarui element al unui sir de caractere.

Pointerii sunt variabile care accepta operatii aritmetice, cum ar fi adunarea, scaderea cu
valori naturale, acestea reprezentand schimbarea adresei de memorie a pointerului.

Este important sa avem grija atunci cand facem scaderi sau adunari ca noua adresa mem-
orata de pointer sa nu depaseasca zona de memorie a stringului catre care indica, pentru a nu
genera comportamente impredictibile.
O alta operatie permisa este diferenta dintre doi pointeri, aceasta indicand numarul de
caractere dintre adresele celor doi pointeri, fiind important sa ne asiguram ca valoarea calculata
are sens, si nu conduce la comportament impredictibil.

Functii predefinite pentru siruri de caractere


Biblioteca cstring vine cu o serie de functii predefinite care lucreaza cu siruri de caractere, le vom
descrie intr-o ordine aleatorie, cu exemple. Descrieri complete ale functiilor, din documentatia
C++ aici

1. size_t strlen(const char *s) Functia strlen primeste ca parametru un sir de carac-
tere si returneaza lungimea acestuia, in numar de caractere, fara a numara si caracterul
NULL.

4
2. char* strcpy(char *dest, const char* src)
Copiaza caracterele din sirul aflat la src, inclusiv caracterul NULL, peste caracterele aflate
la adresa dest, returnand adresa dest. IMPORTANT: daca adresele dest si src se suprapun
aceasta functie are comportament impredictbil.

3. char* strncpy(char *dest, const char* src, size_t n)


Copiaza peste sirul memorat la adresa dest primele n caractere din sirul aflat la adresa
src, fara a copia si caracterul NULL daca acesta nu se regaseste printre cele n caractere
copiate. Daca nu exista n caractere la adresa src se vor copia cate caractere exista.
Functia returneaza adresa dest. IMPORTANT: daca adresele dest si src se suprapun
aceasta functie are comportament impredictbil.

4. char* strcat(char *dest, const char* src)


Aceasta functie concateneaza(lipeste la finalul) sirul aflat la adresa dest continutul sirului
aflat la adresa src, returnand adresa sirului dest.

5. char* strncat(char *dest, const char* src, size_t n) In mod analog, aceasta
functie concateneaza cel mult n caractere din sirul aflat la adresa src sirului aflat la
adresa dest, returnand adresa sirului dest.

6. char* strchr(char *s, const char c) Cauta caracterul c in sirul s si returneaza un


pointer catre prima(cea mai din stanga) aparitie a caracterului c in sirul s, sau pointerul
NULL daca caracterul c nu apare in sirul s.

5
7. char* strrchr(char *s, const char c) Cauta caracterul c in sirul s si returneaza un
pointer catre ultima(cea mai din dreapta) aparitie a caracterului c in sirul s, sau pointerul
NULL daca caracterul c nu apare in sirul s.

8. char* strstr(char *str1, const char* str2) Cauta sirul str2 in sirul s1 si returneaza
un pointer catre prima aparitie a acestuia in sirul str1, sau pointerul NULL daca acesta
nu se regaseste. IMPORTANT: Nu exista functia strrstr !!!

9. int strcmp(char *str1, char* str2) Compara lexicografic sirurile str1 si str2 si re-
turneaza o valoare pozitiva daca s1¿s2, valoarea 0 daca sirurile sunt 0 si o valoare negativa
daca s1¡s2. Compararea lexicografica presupune compararea caracter cu caracter, pana la
intalnirea unui caracter distinct in cele doua siruri, urmand ca semnul dintre aceste doua
caractere(in codul ASCII) sa fie semnul rezultat. Valorile returnate de functia strcmp pot
fi 1,0,-1 dar nu exista o regula care sa stabileasca faptul ca acestea sunt

10. char* strtok(char *s, const char *delim) Aceasta functie primeste prin intermediul
primului parametru un string iar prin al doilea parametru un sir de delimitatori, urmand
sa caute primul dintre delimitatori in sirul initial, sa il inlocuiasca cu caracterul NULL atat
pe el cat si posibila secventa de delimitatori aflati in pozitii consecutive cu el, urmand
a returna stringul de la pozitia initiala pana la primul delimitator. Utilitatea functiei
consta in posibilitatea de a imparti un text in cuvinte, dupa urmatoarea schema:

6
7

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