Ș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. 1. Citim câte un cuvânt până la spațiu.
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. 1. 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
\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
Îl copiază pechar * strcpy (char * destination, const char * source);sourceîndestination.
Exempluchar destination[55]; char source[55] = "bac 2024"; strcpy(destination, source); // destination = "bac 2024" -
strncpy
Copiază primelechar * strncpy (char * destination, const char * source, int count);ncaractere dinsourceîndestination.- Dacă
counteste mai mare decâtsourcese va insera\0până la count. - Dacă
sourceeste mai mare decâtcountnu se va insera\0la final.
Exempluchar destination[55]; char source[55] = "bac 2024"; int count = 3; strncpy(destination, source, count); // destination = "bac" - Dacă
-
strcat
Îl concatenează închar * strcat (char * destination, const char * source);destinationpesourceîncepând de la primul\0.
Exempluchar destination[55] = "bac "; char source[55] = "2024"; strcat(destination, source); // destination = "bac 2024" -
strncat
Concatenează primelechar * strncat (char * destination, const char * source, int count);ncaractere dinsourceîndestinationîncepând de la\0.- Dacă
counteste mai mare decâtsourcese va copia până la\0.
Exempluchar destination[55] = "bac"; char source[55] = " 2024567"; int count = 5; strncat(destination, source, count); // destination = "bac 2024" - Dacă
-
strcmp
Comparăint strcmp (char * str1, const char * str2);str1custr2. 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
str1decât înstr2returnează 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
str1decât înstr2returnează o valoare> 0.
Exempluchar 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
Compară până la n caractere dinint strncmp (char * str1, const char * str2, int count);str1cu cele dinstr2. Continuă până când gasește un caracter diferit, ajunge lacountsau dă de\0.- Dacă primul caracter care nu se potrivește are o valoare mai mică în
str1decât înstr2returnează 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
str1decât înstr2returnează o valoare> 0.
Exempluchar 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
Returnează un pointer către prima apariție a luichar * strchr (char * str, char c);cînstr.- Dacă
cnu este găsit, returneazăNULL.
Exempluchar str[55] = "bac scoala 2024"; char c = 'a'; strchr(str, c); // "ac scoala 2024" - Dacă
-
strrchr
Returnează un pointer către ultima apariție a luichar * strrchr (char * str, char c);cînstr.- Dacă
cnu este găsit, returneazăNULL.
Exempluchar str[55] = "bac scoala 2024"; char c = 'a'; strrchr(str, c); // "a 2024" - Dacă
-
strstr
Returnează un pointer către prima apariție a luichar * strstr (char * str1, char * str2);str2înstr1.- Dacă
str2nu este găsit, returneazăNULL. - Dacă dă de
\0se oprește.
Exempluchar str1[55] = "bac scoala 2024"; char str2[55] = "20"; strstr(str1, str2); // "2024" - Dacă
-
strtok
Caută prima secvență care începe cu unchar * strtok (char * str, char * delim);char ccare nu este dindelimși se termină cu unchar cdindelim.- Dacă
stresteNULL, continuă de unde a rămas din invocarea anterioară. - Dacă nu mai găsește, returnează
NULL.
Exempluchar 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
Returnează lungimea luiint strlen (const char * str);str, adică atunci când întâlnește caracterul\0.
Exempluchar 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