Ș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. ```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"
```
  1. 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';
    
  2. 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
    
  3. 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
    
  2. 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 în destination.

    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 din source în destination.

    • Dacă count este mai mare decât source se va insera \0 până la count.
    • Dacă source este mai mare decât count 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"
    
    
  • strcat

    char * strcat (char * destination, const char * source);
    

    Îl concatenează în destination pe source î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 din source în destination începând de la \0.

    • Dacă count este mai mare decât source 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"
    
    
  • strcmp

    int strcmp (char * str1, const char * str2);
    

    Compară str1 cu str2. 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 în str2 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 în str2 returnează o valoare > 0.

    Exemplu

    char str1[55] = "abbeb ca";
    char str2[55] = "bbc";
    strcmp(str1, str2); // ('e' - 'c') = 2
    
    
  • strncmp

    int strncmp (char * str1, const char * str2, int count);
    

    Compară până la n caractere din str1 cu cele din str2. Continuă până când gasește un caracter diferit, ajunge la count sau dă de \0.

    • Dacă primul caracter care nu se potrivește are o valoare mai mică în str1 decât în str2 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 în str2 returnează o valoare > 0.

    Exemplu

    char str1[55] = "abbeb ca";
    char str2[55] = "bbxx";
    int count = 2;
    strncmp(str1, str2, count); // 0
    
    
  • strchr

    char * strchr (char * str, char c);
    

    Returnează un pointer către prima apariție a lui c în str.

    • Dacă c nu este găsit, returnează NULL.

    Exemplu

    char str[55] = "bac scoala 2024";
    char c = 'a';
    strchr(str, c); // "ac scoala 2024"
    
  • strrchr

    char * strrchr (char * str, char c);
    

    Returnează un pointer către ultima apariție a lui c în str.

    • Dacă c nu este găsit, returnează NULL.

    Exemplu

    char str[55] = "bac scoala 2024";
    char c = 'a';
    strrchr(str, c); // "a 2024"
    
  • strstr

    char * strstr (char * str1, char * str2);
    

    Returnează un pointer către prima apariție a lui str2 în str1.

    • 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"
    
  • strtok

    char * strtok (char * str, char * delim);
    

    Caută prima secvență care începe cu un char c care nu este din delim și se termină cu un char c din delim.

    • Dacă str este NULL, 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"
    
  • 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