Linguaggio C++

Libreria String

Introduzione alla libreria string di C++: utilizzo della classe std::string, funzioni principali e laboratorio pratico.

La libreria <string> del C++ mette a disposizione il tipo std::string, cioe una stringa "vera", molto piu comoda e sicura rispetto ai classici array di char. Con std::string possiamo leggere, modificare, concatenare e analizzare testi in modo semplice.


1️⃣ Perche usare std::string invece di char[]

In C esistevano solo le stringhe come array di char terminati da \0:


char nome[20] = "Mario";

In C++ possiamo usare std::string:


#include <string>
#include <iostream>
using namespace std;

int main() {
    string nome = "Mario";
    cout << nome;
}

Vantaggi di std::string:

  • gestisce automaticamente la lunghezza della stringa
  • offre molte funzioni gia pronte (length, substr, find...)
  • evita facilmente errori di memoria tipici degli array di char

2️⃣ Creazione e assegnazione di stringhe

Alcuni modi per dichiarare e assegnare una stringa:


string s1 = "Ciao";
string s2("Mondo");
string s3;

s3 = s1 + " " + s2;   // concatenazione
cout << s3;           // stampa "Ciao Mondo"

Possiamo usare l operatore + per concatenare stringhe e += per aggiungere testo in coda.


string frase = "Ciao";
frase += " a tutti";

3️⃣ Lunghezza della stringa: length() e size()

Per conoscere il numero di caratteri di una stringa si usano length() o size() (le due funzioni fanno la stessa cosa):


string parola = "Programmazione";
cout << "Lunghezza: " << parola.length() << endl;
cout << "Lunghezza: " << parola.size() << endl;

In questo esempio la lunghezza e 13.


4️⃣ Accesso ai caratteri: operator[] e at()

Possiamo accedere ai singoli caratteri come in un array:


string testo = "Ciao";
cout << testo[0];   // stampa C
cout << testo[1];   // stampa i

Oppure usare at(), che fa un controllo di sicurezza sull indice:


cout << testo.at(2);   // stampa a

5️⃣ Input di stringhe: cin e getline()

Con cin si legge solo fino al primo spazio:


string nome;
cin >> nome;   // se inserisco "Mario Rossi" legge solo "Mario"

Per leggere una riga completa, inclusi gli spazi, si usa getline():


string nomeCompleto;
getline(cin, nomeCompleto);   // legge tutta la riga, spazi inclusi

6️⃣ Funzioni utili: substr(), find(), erase(), insert()

La libreria <string> offre molte funzioni utili.

substr(): estrarre una parte di stringa

string testo = "Programmare in C++";
string parola = testo.substr(0, 11);  // da posizione 0, lungo 11 caratteri
cout << parola;                       // "Programmare"
find(): cercare una sottostringa

string frase = "Benvenuto nel corso di C++";
size_t pos = frase.find("corso");

if (pos != string::npos) {
    cout << "Trovato alla posizione: " << pos;
} else {
    cout << "Non trovato";
}
erase() e insert(): modificare il contenuto

string s = "Ciao mondo";

// cancella 5 caratteri a partire dalla posizione 4
s.erase(4, 5);         // ora s contiene "Ciao"

// inserisce " a tutti" alla fine
s.insert(s.length(), " a tutti");  // "Ciao a tutti"

7️⃣ Conversione da stringa a numero: stoi(), stof()

Spesso si legge un numero come stringa e poi lo si converte in intero o float:


#include <string>

string s = "123";
int n = stoi(s);       // converte in intero

string s2 = "3.14";
float f = stof(s2);    // converte in float

Se il contenuto della stringa non e un numero valido, la conversione puo generare un errore.


📚 Tabella delle principali funzioni della libreria <string>

La classe std::string mette a disposizione numerose funzioni per gestire, analizzare e modificare testi. La seguente tabella riassume le funzioni più utilizzate nelle esercitazioni e nei programmi reali.

Categoria Funzione Descrizione Esempio
Informazioni sulla stringa size() Restituisce il numero di caratteri s.size()
length() Identico a size() s.length()
empty() Restituisce true se la stringa è vuota s.empty()
capacity() Memoria allocata in buffer s.capacity()
max_size() Massima dimensione possibile s.max_size()
Accesso ai caratteri operator[] Accede al carattere senza controllo bounds s[0]
at() Accede con controllo bounds s.at(1)
front() Primo carattere s.front()
back() Ultimo carattere s.back()
Modifica della stringa append() Aggiunge testo alla fine s.append("ciao")
push_back() Aggiunge un carattere s.push_back('a')
pop_back() Rimuove l'ultimo carattere s.pop_back()
insert() Inserisce testo o caratteri s.insert(5, "ciao")
erase() Rimuove caratteri dalla stringa s.erase(2, 3)
replace() Sostituisce parte della stringa s.replace(0, 4, "Hello")
clear() Svuota la stringa s.clear()
resize() Cambia la lunghezza della stringa s.resize(20)
reserve() Riserva capacità in memoria s.reserve(50)
Ricerca e analisi find() Trova una sottostringa s.find("ciao")
rfind() Trova da destra s.rfind("a")
find_first_of() Trova il primo carattere tra un set s.find_first_of("aeiou")
find_last_of() Trova l'ultimo carattere tra un set s.find_last_of("0123456789")
find_first_not_of() Primo carattere non appartenente al set s.find_first_not_of(" ")
find_last_not_of() Ultimo carattere non appartenente al set s.find_last_not_of(" ")
compare() Confronta due stringhe s.compare("test")
Estrazione testo substr() Ritorna una sottostringa s.substr(0,5)
copy() Copia parte della stringa in un array di char s.copy(arr, 5)
c_str() Ritorna una stringa C-style (char*) s.c_str()
Conversioni stoi() String → int stoi("123")
stol() String → long stol("123")
stof() String → float stof("3.14")
stod() String → double stod("3.14159")
LABORATORIO

Primi passi con la libreria string

In questo laboratorio utilizzerai std::string per leggere, analizzare e modificare testi. Imparerai a usare le funzioni piu importanti: length, substr, find, insert ed erase.


1 Lettura del nome completo

Scrivi un programma che legge il nome completo di una persona (nome e cognome) usando getline e ne stampa il contenuto e la lunghezza.


#include <iostream>
#include <string>
using namespace std;

int main() {
    string nomeCompleto;

    cout << "Inserisci il tuo nome completo: ";
    getline(cin, nomeCompleto);

    cout << "Hai inserito: " << nomeCompleto << endl;
    cout << "Lunghezza: " << nomeCompleto.length() << endl;

    return 0;
}

2 Concatenazione di stringhe

Chiedi all utente nome e cognome in due stringhe separate, poi crea una terza stringa che li unisce con uno spazio in mezzo.


string nome, cognome;

cout << "Nome: ";
cin >> nome;

cout << "Cognome: ";
cin >> cognome;

string completo = nome + " " + cognome;
cout << "Nome completo: " << completo << endl;

3 Ricerca di una parola

Scrivi un programma che legge una frase e una parola, poi verifica se la parola e contenuta nella frase usando find().


string frase, parola;

cout << "Inserisci una frase: ";
cin.ignore();                // se necessario per pulire il buffer
getline(cin, frase);

cout << "Inserisci una parola da cercare: ";
cin >> parola;

size_t pos = frase.find(parola);

if (pos != string::npos) {
    cout << "Parola trovata alla posizione: " << pos << endl;
} else {
    cout << "Parola non trovata" << endl;
}

4 Esercizi aggiuntivi

  • Leggi una frase e stampala tutta in maiuscolo (usando toupper su ogni carattere).
  • Chiedi all utente una password e verifica che abbia almeno 8 caratteri.
  • Estrarre i primi 5 caratteri di una stringa usando substr.
  • Sostituire una parola in una frase usando find, erase e insert.