Articolo originale: https://www.freecodecamp.org/news/c-string-std-string-example-in-cpp/

Le stringhe sono componenti essenziali in qualsiasi linguaggio di programmazione e C++ non fa eccezione.

Sia che tu voglia archiviare testo, manipolarlo o accettare input e output da tastiera, capire cosa sono le stringhe e come usarle in modo efficace è estremamente importante.

Questo articolo insegnerà tutto ciò che devi sapere sulla gestione e l'utilizzo delle stringhe in C++.

Cos'è una stringa?

Le stringhe, al loro interno, sono essenzialmente insiemi di caratteri. Alcuni esempi possono essere "Ciao Mondo", "Il mio nome è Jason" e così via. Sono racchiusi tra virgolette ".

In C++ abbiamo due tipi di stringhe:

  1. Stringhe in C-style
  2. std::string (dalla classe Standard di stringa C++ )

Puoi facilmente creare la tua classe di stringhe con le loro piccole funzioni, ma non è qualcosa di cui parleremo in questo articolo.

Stringhe in C-style

Si tratta di stringhe derivate dal linguaggio di programmazione C e continuano ad essere supportate in C++. Queste "raccolte di caratteri" sono archiviate sotto forma di array di tipo char con terminazione null (il carattere null  \0).

Come definire una stringa in C-style:

char str[] = "c string";

Qui str è un array di char di lunghezza 9 (il carattere extra deriva dal carattere null \0 aggiunto dal compilatore).

Ecco alcuni altri modi per definire le stringhe in C-style in C++:

char str[9] = "c string";
char str[] = {'c', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};
char str[9] = {'c', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};

Come passare stringhe in C-style a una funzione

#include <iostream>

int main() {
    char str[] = "Questa è una stringa in C-style";
    display(str);
}

// Le stringhe in C-style possono essere passate alle funzioni come segue:
void display(char str[]) {
    std::cout << str << "\n";
}

Come utilizzare le funzioni di stringa in C-style in C++

La libreria Standard di C  include un paio di utili funzioni che puoi usare per manipolare le stringhe. Sebbene non sia ampiamente consigliato l'uso (vedi sotto), puoi comunque usarli nel codice C++ includendo l'intestazione  <cstring>:

#include <cstring> // necessario


1. strcpy(s1,s2) --> Copia la stringa s2 nella stringa s1                 
2. strcat(s1,s2) --> Concatena la stringa s2 alla fine della stringa s1
3. strlen(s1)    --> Restituisce la lunghezza della stringa s1          
4. strcmp(s1,s2) --> Restituisce 0 se s1==s2; minore di 0 se s1<s2; maggiore di 0 se s1>s2
5. strchr(s1,ch) --> Restituisce un puntatore alla prima occorrenza del carattere ch nella stringa s1
6. strstr(s1,s2) --> Restituisce un puntatore alla prima stringa s2 nella stringa s1      

std::string

Le stringhe in C-style sono relativamente pericolose: se la stringa e l'array di char non sono terminate con null, si può avere tutta una serie di potenziali bug.

Ad esempio, gli overflow del buffer tra tutta una serie di altri inconvenienti, sono alcuni dei motivi per cui l'uso di stringhe in C-style non è raccomandato nella comunità degli sviluppatori C++.

La classe std::string fornita dalla libreria Standard C++ è un'alternativa molto più sicura. Ecco come usarla:

Come definire una std::string

#include <iostream> 
#include <string> // la classe standard di stringhe di C++

int main() {
    std::string str = "Stringa C++";
    std::cout << str << "\n"; // stampa `Stringa C++`
}

La differenza più ovvia da notare tra le stringhe in C-style e std::string  è la lunghezza della stringa. Se hai bisogno della lunghezza di una stringa in C-style, dovrai calcolarla ogni volta usando la funzione strlen() in questo modo:

#include <iostream>
#include <cstring> // necessaria per usare `strlen`

int main() {
    char str[] = "Ciao mondo";
    std::cout << strlen(str) << "\n";
}

Se non la memorizzi in una variabile e lo richiedi in più parti del tuo programma, puoi rapidamente osservare quanto sia costosa questa opzione.

Invece, una stringa std::string ha già in se una proprietà di lunghezza. Per accedervi si utilizza la proprietà .length() come segue:

#include <iostream>
#include <string> // necessaria per usare `std::string`

int main() {
    std::string str = "freeCodeCamp";
    std::cout << str.length() << "\n";
}

Semplice, ordinato, conciso, con un'importante riduzione computazionale.

Ma l'accesso alla proprietà length non è l'unico vantaggio nell'utilizzo di std::string. Ecco qualche altro esempio:

#include <iostream>
#include <string>

int main() {
   std::string str = "freeCodeCamp";
   
   // Inserimento di un singolo carattere in `str`
   str.push_back('s');
   std::cout << str << "\n"; // `str` ora è `freeCodeCamps`
   
   // Eliminazione dell'ultimo carattere da `str`
   str.pop_back();
   std::cout << str << "\n"; // `str` ora è `freeCodeCamp`
   
   // Ridimensionamento di una stringa
   str.resize(13);
   std::cout << str << "\n"; 
   
   // Diminuzione della capacità in eccesso della stringa
   str.shrink_to_fit()
   std::cout << str << "\n";
}

Come passare una std::string a una funzione

#include <iostream>

int main() {
    std::string str = "Questa è stringa C-style";
    display(str);
}

// Passare `std::string` è come passare semplicemente un oggetto normale
void display(std::string str) {
    std::cout << str << "\n";
}

Quando usare una stringa in C-style su std::string?

A questo punto, dovresti essere convinto dei numerosi vantaggi che std::string ha rispetto alle stringhe in C-style (in particolare la gestione automatica della memoria). Ma ci sono situazioni in cui vorresti invece usare stringhe in C-style:

  1. Se vieni da un background in C, potresti essere a tuo agio nel lavorare con le stringhe in C-style.
  2. Una std::string, nonostante i suoi vantaggi, è estremamente complessa. Come il resto della lingua, se non sai cosa stai facendo, può, velocemente, diventare molto complicato. Inoltre, utilizza una tonnellata di memoria che potrebbe non essere l'ideale per gli scopi dei tuoi programmi.
  3. Se stai attento a gestire la memoria del tuo programma durante il runtime (liberando la memoria di un oggetto quando hai finito di usarlo), c'è un vantaggio in termini di prestazioni nell'usare stringhe in C-style considerando quanto sono piccole e leggere.

Ricapitolando

Spero che questo articolo sia servito come introduzione alle stringhe in C++. C'è molto altro da imparare su questa meravigliosa astrazione e spero di scrivere altri articoli che approfondiscano i concetti più avanzati di stringhe e C++.

Assicurati di seguirmi su Twitter per gli aggiornamenti sul mio percorso di apprendimento C++. Buon apprendimento!