Il linguaggio C++ mette a disposizione la classe string per operare con oggetti che forniscono le funzionalità delle classiche stringhe del C, rendendo le operazioni di manipolazione molto più comode. Per poter utilizzare le stringhe in stile C++ bisogna includere il file di libreria string nel proprio file sorgente, dopodiché per la dichiarazione di una variabile di classe string e per il suo utilizzo, C++ mette a disposizione sia una sintassi analoga a quella utilizzata per le variabili di tipo primitivo, sia la sintassi tipica degli oggetti del paradigma OOP.
1 2 3 4 |
#include <string> //libreria C++ da non confondere con la libreria string.h del C string nome, cognome; //dichiarazione di due stringhe in stile C++ senza inizializzazione string s1="Sono una stringa in stile C++"; //Inizializzazione classica string s2("Sono una stringa in stile C++"); //Inizializzazione in stile OOP tramite costruttore |
Con le stringhe in stile C++ la quantità di memoria allocata viene adattata automaticamente, superando così il problema del dimensionamento su un numero fissato di caratteri di una stringa in stile C. Il linguaggio C++, comunque, mantiene la gestione delle stringhe in stile C ed anzi esse sono ancora fondamentali, soprattutto in alcuni contesti di programmazione in cui al contrario si ha l’esigenza di lavorare con variabili stringa a dimensione fissa, quali sono appunto le stringhe in stile C.
Con le stringhe in stile C++ è possibile utilizzare l’operatore di assegnazione per assegnare ad esse un carattere, un’altra stringa in stile C++ o una stringa in stile C (sia costante, ossia tra “…”, sia come vettore di char).
Esempi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> #include <string.h> //libreria C #include <string> //libreria C++ using namespace std; int main() { char s2[15]="con "; //sono una stringa in stile C string s1, s3, s4, s5; //siamo stringhe in stile C++ s1="Operare "; //AMMESSO s3=s2; //AMMESSO s5='.'; //AMMESSO s4=s1+s3+"le stringhe"+s5; //CONCATENAMENTO cout << s4; return 0; } |
Il codice precedente produce in output il messaggio: “Operare con le stringhe.” Si noti come con le stringhe in stile C++ il concatenamento di stringhe può essere realizzato con l’operatore ‘+’.
Con esse inoltre, è possibile utilizzare tutti gli operatori di confronto:
1 2 3 |
string s1, s2; if(s1==s2)… //CORRETTO while(s1<=s2)… //CORRETTO |
Metodi per la manipolazione delle stringhe
Le stringhe in stile C++ sono oggetti dotati di funzioni membro (o metodi) che è possibile richiamare su una stringa tramite la classica notazione puntata nomeOggetto.attributo e nomeOggetto.metodo:
1 2 3 |
string saluto="Buongiorno!"; cout << saluto.lenght(); //stampa a video 11 (la lunghezza in caratteri della stringa) saluto.empty // restituisce il valore booleano FALSE, perché la stringa non è vuota |
L’accesso agli elementi di una stringa può realizzarsi con il metodo at(int i) o tramite operatore [ ]. Il primo carattere è nella posizione zero.
1 2 3 4 |
string s="ciao"; char c; c=s.at(2); //c='a' c=s[1]; //c='i' |
L’inserimento di una stringa in un’altra può essere realizzato con il metodo string& insert(int start, string s)
- start è la posizione da cui inizia l’inserimento; le posizioni si iniziano a contare da zero;
- s è la stringa da inserire.
L’estrazione di una sotto-stringa viene fatta tramite il metodo string& substr(int start,int n)
- start è la posizione dalla quale inizia l’estrazione (le posizioni si iniziano a contare da zero);
- n è il numero di caratteri da estrarre; è opzionale: se non specificato estrae fino all’ultimo carattere;
- NOTA – la stringa sulla quale si richiama il metodo rimane invariata.
La cancellazione di una sotto-stringa viene fatta tramite il metodo string& erase(int start, int n)
- start è la posizione di inizio della cancellazione e si inizia a contare da zero;
- n è il numero di caratteri da cancellare; è opzionale: se non specificato cancella fino all’ultimo carattere;
Si può cancellare e sostituire una sotto-stringa all’interno di una stringa tramite il metodo string& replace(int start, int n, string s)
- start è la posizione di inizio della cancellazione e sostituzione (si inizia a contare da zero);
- n è il il numero di caratteri da cancellare;
- s è la stringa da aggiungere.
Si può ricercare una sotto-stringa all’interno di una stringa tramite il metodo int find(string s, int start)
- s è la sotto-stringa da cercare;
- start è la posizione dalla quale iniziare la ricerca
- il metodo restituisce la posizione del primo carattere della sotto-stringa trovata, contata a partire da zero.
Si può convertire una stringa in stile C++ in una in stile C (vettore di char, char*) con il metodo char* c_char(). Questo metodo è utile per rendere il codice C++ che utilizza le stringhe di tipo string, compatibile con le librerie che richiedono l’utilizzo di vettori di char e costanti stringa.
Esempi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> #include <string> using namespace std; int main(){ string s="Bianchi;Andrea;Viale Marconi, 40;56100;Pisa"; s=s+';'; //concatena il carattare ';' cout<<s.length()<<endl; while(s.length()!=0){ cout<<s.substr(0, s.find(";", 0))<<endl; //estrae un campo fino al ';' escluso s.erase(0, s.find(";",0)+1); //cancella il primo campo, compreso il carattere ';' } cout<<s.length()<<endl; return 0; } |
1 2 3 4 5 6 7 |
44 Bianchi Andrea Viale Marconi, 40 56100 Pisa 0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <string.h> //libreria C #include <string> //libreria C++ using namespace std; int main() { char s2[20]; string s="Tanto va che ci lascia lo zampino!"; string s1="la gatta al lardo "; s.insert(9,s1); //s diviene “Tanto va la gatta al lardo che ci lascia lo zampino!" cout << s << endl; cout << s.substr(9, 8) << endl; //stampa a video: "la gatta" cout << s.erase(5, 38) << endl; //stampa a video: "Tanto zampino!" cout << s.replace(6, 8, "vale!") << endl; //stampa a video: "Tanto vale!" cout << s.find("a", 5) << endl; //stampa a video: 7 strcpy(s2, s.c_str()); //converte s in stile C e la copia in s2 cout << s2; return 0; } |