Șiruri de caractere
Pentru a face operații cu șiruri de caractere ne putem folosi de librăria cstring
. Aceasta are mai multe funcții care ne ajută să manipulăm șirurile de caractere. Pentru a folosi cstring
trebuie să îl includem folosind #include <cstring>
la începutul programului.
Citire
Atunci când trebuie să citim caractere avem mai multe opțiuni.
- Citim câte un cuvânt până la spațiu. ```cpp char s1[55]; cin >> s1;
char s2[55];
cin >> s2;
// Dacă inputul este: "abc def", s1 va avea valoarea "abc", iar s2 ca avea valoarea "def"
```
-
Le citim pe rând și le memorăm într-un vector.
char s[55]; for (int i = 0; i < 50; i++) { cin >> s[i]; } s[50] = '\0';
-
Le citim într-un vector de caractere folosind funcția
cin.get()
.char s[55]; cin.get(s, 50); // Citește până ajunge la \0 (și reține `\n`) sau citește 50 de caractere
-
Citim câte un singur rând folosind funcția
cin.getline()
.char s[55]; cin.getline(s, 50); // Citește până ajunge la \n (și nu îl reține) sau citește 50 de caractere
Afișare
Atunci când afișăm un șir de caractere avem mai multe opțiuni.
- Afișăm caracterele pe rând.
char s[55] = "abcde"; s[5] = '\0'; for (int i = 0; i < strlen(s); i++) { cout << s[i]; } // Se afișează abcde
- Afișăm șirul folosind cout. Acesta se va afișa până întâlnește caracterul
\0
.char s[55] = "abcde"; s[5] = '\0'; cout << s; // Se afișează abcde
Funcții
strcpy | strncpy | strcat | strncat | strcmp | strncmp | strchr | strrchr | strstr | strtok | strlen
-
strcpy
char * strcpy (char * destination, const char * source);
Îl copiază pe
source
îndestination
.Exemplu
char destination[55]; char source[55] = "bac 2024"; strcpy(destination, source); // destination = "bac 2024"
-
strncpy
char * strncpy (char * destination, const char * source, int count);
Copiază primele
n
caractere dinsource
îndestination
.- Dacă
count
este mai mare decâtsource
se va insera\0
până la count. - Dacă
source
este mai mare decâtcount
nu se va insera\0
la final.
Exemplu
char destination[55]; char source[55] = "bac 2024"; int count = 3; strncpy(destination, source, count); // destination = "bac"
- Dacă
-
strcat
char * strcat (char * destination, const char * source);
Îl concatenează în
destination
pesource
începând de la primul\0
.Exemplu
char destination[55] = "bac "; char source[55] = "2024"; strcat(destination, source); // destination = "bac 2024"
-
strncat
char * strncat (char * destination, const char * source, int count);
Concatenează primele
n
caractere dinsource
îndestination
începând de la\0
.- Dacă
count
este mai mare decâtsource
se va copia până la\0
.
Exemplu
char destination[55] = "bac"; char source[55] = " 2024567"; int count = 5; strncat(destination, source, count); // destination = "bac 2024"
- Dacă
-
strcmp
int strcmp (char * str1, const char * str2);
Compară
str1
custr2
. Continuă până când gasește un caracter diferit sau dă de\0
.- Dacă primul caracter care nu se potrivește are o valoare mai mică în
str1
decât înstr2
returnează o valoare< 0
. - Dacă cele două șiruri sunt egale returnează
0
. - Dacă primul caracter care nu se potrivește are o valoare mai mare în
str1
decât înstr2
returnează o valoare> 0
.
Exemplu
char str1[55] = "abbeb ca"; char str2[55] = "bbc"; strcmp(str1, str2); // ('e' - 'c') = 2
- Dacă primul caracter care nu se potrivește are o valoare mai mică în
-
strncmp
int strncmp (char * str1, const char * str2, int count);
Compară până la n caractere din
str1
cu cele dinstr2
. Continuă până când gasește un caracter diferit, ajunge lacount
sau dă de\0
.- Dacă primul caracter care nu se potrivește are o valoare mai mică în
str1
decât înstr2
returnează o valoare< 0
. - Dacă cele două șiruri sunt egale returnează
0
. - Dacă primul caracter care nu se potrivește are o valoare mai mare în
str1
decât înstr2
returnează o valoare> 0
.
Exemplu
char str1[55] = "abbeb ca"; char str2[55] = "bbxx"; int count = 2; strncmp(str1, str2, count); // 0
- Dacă primul caracter care nu se potrivește are o valoare mai mică în
-
strchr
char * strchr (char * str, char c);
Returnează un pointer către prima apariție a lui
c
înstr
.- Dacă
c
nu este găsit, returneazăNULL
.
Exemplu
char str[55] = "bac scoala 2024"; char c = 'a'; strchr(str, c); // "ac scoala 2024"
- Dacă
-
strrchr
char * strrchr (char * str, char c);
Returnează un pointer către ultima apariție a lui
c
înstr
.- Dacă
c
nu este găsit, returneazăNULL
.
Exemplu
char str[55] = "bac scoala 2024"; char c = 'a'; strrchr(str, c); // "a 2024"
- Dacă
-
strstr
char * strstr (char * str1, char * str2);
Returnează un pointer către prima apariție a lui
str2
înstr1
.- Dacă
str2
nu este găsit, returneazăNULL
. - Dacă dă de
\0
se oprește.
Exemplu
char str1[55] = "bac scoala 2024"; char str2[55] = "20"; strstr(str1, str2); // "2024"
- Dacă
-
strtok
char * strtok (char * str, char * delim);
Caută prima secvență care începe cu un
char c
care nu este dindelim
și se termină cu unchar c
dindelim
.- Dacă
str
esteNULL
, continuă de unde a rămas din invocarea anterioară. - Dacă nu mai găsește, returnează
NULL
.
Exemplu
char str[50] = " Da. Probabil? De_bună_seamă!:)"; char delim[10] = "!?.,-;() "; strtok(str, delim); // "Da" strtok(NULL, delim); // "Probabil" strtok(NULL, delim); // "De_bună_seamă" strtok(NULL, delim); // "NULL"
- Dacă
-
strlen
int strlen (const char * str);
Returnează lungimea lui
str
, adică atunci când întâlnește caracterul\0
.
Exemplu
char s[55] = "Bac2024"; strlen(s); // 7
Pointeri și șiruri
Atunci când apelăm o funție precum strchr
sau strstr
, aceasta va returna un pointer la caracterul, respectiv începutul șirului pe care îl găsește. Acesta este un lucru foarte important, deoarece putem afla exact pe ce poziție se află caracterul sau udne începe șirul găsit. Pentru a obține o valoare întreagă dintr-un pointer, trebuie să îl scadem din alt pointer. Acest lucru funcționează, deoarece memoria este continuă. Spre exemplu, prima poziție a unui șir se poate afla la pointerul 0x000010
. Asta înseamnă că un caracter de la poziția 2
a șirului (sau al 3-lea caracter al șirului) se află la pointerul 0x000012
.
Exemplu
char s[55] = "Bac2024";
int pos = strchr(s, 'a') - s;
cout << pos; // 1