Șiruri de caractere

Șirurile de caractere pot fi manipulate în cpp cu ajutorul librăriilor precum <cstring> și <string>. <cstring> oferă mai multe funții ce pot modifica direct un șir de caractere, în timp ce <string> este în sine o clasă cu interfață.

Caracterele sunt în esență doar niște numere, care sunt apoi interpretate de un standard de cod precum UTF-8 și reprezentate ca și caractere.

<cstring>

Pentru a declara un șir liniar de caractere putem sa folosim un vector normal sau un pointer de tip char, practic echivalentul său. Citirea se realizează normal, într-un vector de caractere. Atunci când afișăm un vector de caractere str, putem apela cout << str;, iar caracterele din vector se vor afișa până când caracterul \0 este atins.

\0 este folosit pentru a semnala că un șir s-a finalizat. Deoarece calculatoarele sunt nevoite să parcurgă liniar seturile de memorie, acest caracter practic îi spune calculatorului să ignore ce a mai rămas în setul de memorie dupa caracterul \0.

Exemplu

char s[55] = "abcdemlc";
str[5] = '\0';

cout << str;
// 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
    

<string>

Un obiect de tip string reprezintă o secventă de caractere. Clasa string oferă o interrfață prin care obiectele pot fi manipulate. În acest caz, șirurile sunt alocate dinamic, acest lucru putând să afecteze timpul de execuție.

Exemplu

string str = "amomogas";
cout << str;
// Se afișează amomogas

Funcții

size | length | resize | clear | empty | append | insert | replace | push_back | pop_back | find | rfind | substr

  • size / length

    size_t size() const;
    size_t length() const;
    

    Returnează mărimea șirului în bytes (1 char = 1 byte).

    Exemplu

    std::string str("Test 123");
    std::cout << str.size();
    // Se afisează: 8
    
  • resize

    void resize (size_t n);
    void resize (size_t n, char c);
    

    Schimbă mărimea stringului să fie egală cu n. Dacă șirul este mai mare, celelalte caractere sunt eliminate, dacă este mai mic, spațiile libere se umplu cu caracterul \0 sau cu parametrul c.

    Exemplu

    std::string str("Test 123");
    
    unsigned size = str.size();
    
    str.resize(size + 2, 'a');
    std::cout << str;
    // Se afisează: Test 123aa
    
  • clear

    void clear();
    

    Șterge întreg conținutul șirului, lungimea acestuia devenind 0.

    Exemplu

    std::string str("Test 123");
    
    str.clear();
    std::cout << str;
    // Se afisează:
    
  • empty

    bool empty() const;
    

    Returnează true dacă șirul este gol (lungimea e 0) sau false dacă nu este gol.

    Exemplu

    std::string str("Test 123");
    
    std::cout << str.empty();
    // Se afisează: false
    
  • append

    string& append (const string& str);
    

    Adaugă str la stringul inițial, mărindui lungimea cu lungimea lui str.

    Exemplu

    std::string str("Test");
    std::string str2("123");
    
    str.append(str2);
    std::cout << str;
    // Se afișează: Test 123
    

    Pentru mai multe, a se consulta documentația.

  • insert

    string& insert (size_t pos, const string& str);
    

    Inserează stringul str în stringul inițial, la poziția specificată.

    Exemplu

    std::string str("Test");
    std::string str2(" 123 ");
    
    str.insert(3, str2);
    std::cout << str;
    // Se afișează: Te 123 st 
    

    Pentru mai multe, a se consulta documentația.

  • replace

    string& replace (size_t pos,  size_t len,  const string& str);
    

    Schimbă o porțiune din string care începe la pos și are o lungime len cu noul str.

    Exemplu

    std::string str("Test UNKNOWN");
    std::string str2("123");
    
    str.replace(5, 7, str2);
    std::cout << str;
    // Se afișează: Test 124
    

    Pentru mai multe, a se consulta documentația.

  • push_back

    void push_back (char c);
    

    Adaugă un caracter la finalul șirului, mărindu-i lungimea cu 1.

    Exemplu

    std::string str("Test 123");
    
    str.push_back('4');
    std::cout << str;
    // Se afisează: Test 1234
    
  • pop_back

    void pop_back();
    

    Șterge un caracter de la finalul șirului, micșorându-i lungimea cu 1

    Exemplu

    std::string str("Test 123");
    
    str.pop_back();
    std::cout << str;
    // Se afisează: Test 12
    
  • find

    size_t find (const string& str, size_t pos = 0) const;
    size_t find (const char* s, size_t pos = 0) const;
    size_t find (const char* s, size_t pos, size_t n) const;
    size_t find (char c, size_t pos = 0) const;
    

    Caută prima apariție a lui str într-un string și returnează poziția sa de început. Dacă pos e specificat, atunci caută după, inclusiv, de la poziția pos.

    Exemplu

    std::string str("pere mere prune mere");
    std::string str2("mere");
    
    std::size_t index = str.find(str2, 11);
    std::cout << index;
    // Se afișează: 16
    

    Pentru mai multe, a se consulta documentația.

  • rfind

    size_t rfind (const string& str, size_t pos = npos) const;
    size_t rfind (const char* s, size_t pos = npos) const;
    size_t rfind (const char* s, size_t pos, size_t n) const;
    size_t rfind (char c, size_t pos = npos) const;
    

    Caută ultima apariție a lui str într-un string și returnează poziția sa de început. Dacă pos e specificat, atunci caută înainte, inclusiv, de la poziția pos.

    Exemplu

    std::string str("pere mere prune mere");
    std::string str2("mere");
    
    std::size_t index = str.find(str2, 11);
    std::cout << index;
    // Se afișează: 5
    

    Pentru mai multe, a se consulta documentația.

  • substr

    string substr (size_t pos = 0, size_t len = npos) const;
    

    Returnează un alt șir construit pe baza celui inițial inițializat ca o copie a unui subșir al șirului inițial care începe de la poziția pos si are lungimea len. Dacă len este lăsat liber, se va considera finalul șirului inițial.

    Exemplu

    std::string str("Cram School Pass 2024!");
    
    std::string newStr = str.substr(0, 11);
    std::cout << newStr;
    // Se afisează: Cram School