8.5 Stringhe

Il C++, contrariamente ad altri linguaggi di programmazione, non definisce nativamente un tipo stringa
(come avviene ad esempio in Java). Le stringhe tradizionali in C vengono assimilate ad un
array di caratteri terminato dal carattere speciale '\0', detto “terminatore di stringa”.

Vediamo un semplice programma che mostra tre metodi per inizializzare una stringa:

Programma in stile C (array di char)
/*
* Un semplice programma che mostra
* l'uso delle stringhe
*/
#include <iostream.h>
using namespace std;

int main() {
  char stringa1[6];
  char stringa2[6];
  // assegnamento del valore della stringa3 in fase di dichiarazione
  char stringa3[5] = "nave";

  // inizializzazione manuale della stringa1
  stringa1[0] = 'p';
  stringa1[1] = 'a';
  stringa1[2] = 'l';
  stringa1[3] = 'l';
  stringa1[4] = 'a';
  stringa1[5] = '\0';

  // immissione da tastiera del valore di stringa2
  cin >> stringa2;

  cout << "stringa1: " << stringa1 << "\n";
  cout << "stringa2: " << stringa2 << "\n";
  cout << "stringa3: " << stringa3 << "\n";
  return 0;
}

Output atteso:

palla
pippo   (supponendo che l'utente inserisca "pippo")
nave

Nota didattica:
con gli array di caratteri occorre sempre ricordare di terminare le stringhe con '\0'.
Questo approccio è più “basso livello” ma permette un maggiore controllo sulla memoria.

Stringhe come oggetti in C++

Il C++ moderno fornisce la libreria <string>, che definisce una classe string.
Le stringhe diventano quindi oggetti, dotati di metodi e operatori per la gestione testuale.

Esempio base con oggetti string
#include <iostream>
#include <string>
using namespace std;

int main() {
  string s1 = "Questa è una stringa";
  string s2("in C++");

  cout << s1 << endl;
  cout << s2;
}

Con le string possiamo usare metodi come size(), at(), append(), substr(),
find(), insert(), erase() e replace().

Esempi di operazioni

Concatenazione
string s1="Alfa";
string s2="Beta";
s1 = s1 + s2;
cout << s1; // AlfaBeta
Accesso ai caratteri
string s="Lambda";
for(int i=0;i<s.size();i++)
  cout << s.at(i) << " ";
Ricerca e sostituzione
string frase="Mangiare la mela fa bene";
cout << frase.find("mela"); // 12

frase.replace(12,4,"pera");
cout << frase; // Mangiare la pera fa bene

Confronto tra approcci

  • C (array di char): più vicino all’hardware, richiede attenzione a dimensioni e terminatori, funzioni da <string.h>.
  • C++ (classe string): più semplice e sicuro, offre metodi potenti e riduce i rischi di errori di buffer.

Osservazione didattica: È utile far vedere agli studenti entrambi i modelli.
Quello “C” mostra come le stringhe siano realmente salvate in memoria,
quello “C++” introduce la programmazione a oggetti e semplifica il lavoro pratico.
Molti errori tipici (buffer overflow, mancanza di terminatore) si evitano con l’uso della classe string.