In C le stringe di caratteri non sono tipi nativi (standard) ma sono tipi strutturati (array di caratteri null-terminated)
Quali sono i vantaggi di usare la classe string
:
La classe string
definisce molti metodi per la manipolazione di stringhe
Alcuni operatori base possono essere usati su stringhe come se fossero tipi nativi
La classe string
implementa due overload degli operatori di flusso << (inserimento) e >> (estrazione)
Pertanto la lettura e scrittura di un oggetto string si esegue semplicemente con gli operatori di flusso come per le stringhe C
cin<>stringa;
file>>stringa;
…
La lettura non inserisce nella stringa gli spazi e i caratteri speciali
A fine lettura la stringa letta sostituisce quella precedente assumendo una nuova dimensione (le stringhe sono generate dinamicamente)
getline per la lettura di una stringa che includa anche gli spazi e i caratteri speciali:
stream.getline(stringa, N, c=’\n’)
estrae caratteri dallo stream di input e li copia nell’oggetto stringa;
l’estrazione termina quando si incontra il carattere c delimitatore di lettura (c è rimosso dal flusso di input ma non inserito nella stringa)
Esempio:
cin.getline(S1,’\t’)
file.getline(S2)
Per concatenare oggetti string tra loro o un oggetto string
con stringhe C e altri oggeti string
si ua il metodo append
:
str.append(stringa);
str.append(stringa,ind,n);
str.append(n,carattere);
str.append(stringaC);
str.append(stringaC,n);
…
Per la concatenazione di oggetti string
e stringhe C si può usare l’operatore + e += (overload)
Esempio:
char s[] = “il mio corso.”;
string S1(“Programmazione I”);
string S2(“Silvia Rossi”);
S1 += “: “;
S1 += s;
cout<S1.append(S2,7,5) + “\n”;
Per confrontare oggetti string tra loro oppure un oggetto string e una stringa C esiste il metodo compare:
str.compare(stringa);
str.compare(ind,n,stringa);
str.compare(ind,n,stringa,ind1,n1);
str.compare(stringaC);
str.compare(stringaC,n);
…
Ritorna 0 se uguali, un numero negativo se str è minore (lessicograficamente) della stringa argomento, positivo se maggiore
Esempio:
string S1(“prog. modulo A “);
char s[] = “il mio programma”;
cout<<S1.compare(0,4,s,7,4);
cout<<S1.compare(s);
Per confrontare oggetti string
tra loro oppure un oggetto string
e una stringa C si può usare gli operatori relazionali (overload):
stringa == stringaC
stringa1 <= stringa2 ;
stringaC != stringa
…
A differenza del metodo compare, gli operatori relazionali ritornano true
o false
Esempio:
char stringaC[] = “prog. modulo A”;
string S1(“prog. modulo A”);
S1.compare(stringaC) ? cout<<”Uguali\n” :
cout<<”Diversi\n”;
S1 == stringaC ? cout<<”Uguali\n” :
cout<<”Diversi\n”;
L’accesso agli elementi di una stringa puó avvenire tramite funzione membro at(int i) o tramite operatore [ ].
il primo carattere é alla posizione zero
Esempio
string s=”ingegneria”;
char c;
c = s.at(2); //c = ‘g’
c= s[1]; //c=’n’
Per inserire elementi (caratteri) in una certa posizione nell’oggetto string
si usa il metodo insert
:
str.insert(pos,stringa);
str.insert(pos,stringa,ind,n);
str.insert(pos,n,carattere);
str.insert(pos,stringaC);
str.insert(pos,stringaC,n);
…
Per la concatenazione di oggetti string
e stringhe C si può usare l’operatore + e += (overload)
Esempio:
char s[] = “Silvia “;
string S2(“Rossi”);
S2.insert(0, “Dr.ssa “);
S2.insert(7, s);
S2.insert(0, 7, ‘*’);
S2.insert(S2.size(),7, ‘*’);
cout<<S2
Per ricercare sottostringhe in un oggetto string
si usano i metodi find
(dall’inizio in avanti) e rfind
(dalla fine all’indietro):
str.find(stringa,pos=0);
str.find(stringaC,pos=0);
str.find(carattere, pos=0);
…
In caso di successo ritorna l’indice del primo carattere della sottostringa trovata, -1 in caso di insuccesso
Il metodo substr estrae una sottostringa e la ritorna per copia:
str.substr(pos=0,n=-1);
Esempio:
string S2(“Silvia Rossi”);
ind = S2.find(“Ros”);
cout<<S2.substr(ind)<<endl;
Per sostituire una sottostringa in un oggetto string con altra stringa (anche C) anche di dimensione diversa si usa il metodo replace:
str.replace(pos,m,stringa);
str.replace(pos,m,stringa,ind,n);
str.replace(pos,m,n,carattere);
str.replace(pos,m,stringaC);
str.replace(pos,m,stringaC,n);
…
Per cancellare una sottostringa si usa il metodo erase
:
str.erase(pos=0,n=-1);
Esempio:
string S1(“Dott.ssa Silvia Rossi”);
S1.replace(0, 8, “Dr”);
S1.erase(S1.find(“Sil”), 7);
cout<<S2.substr(ind)<<endl;
Scriviamo un programma che ci aiuti a comprendere l’uso dei metodi del tipo string nella pratica.
Sia assegnato un file contenente un testo in cui alcune parole sono poste tra parentesi quadre [ ].
Si richiede di generare altri due file:
il primo conterrà 4 puntini al posto di ogni parola tra parentesi quadre,
il secondo conterrà tutte le parole eliminate inserite nello stesso ordine in cui compaiono nel file iniziale.
I due file generati devono avere un nome fisico dato dal nome del file iniziale a cui va aggiunto rispettivamente “01″ e “02″.
Supponiamo che il file di nome testo.txt, senza estensione, abbia il seguente contenuto.
Il programma deve creare due file, il primo di nome testo01.txt ed il secondo testo02.txt.
L’algoritmo può essere facilmente tradotto in C++ utilizzando diversi metodi della classe string
senza la necessità di ulteriori raffinamenti.
Prima di scrivere il programma osserviamo che:
1. Prime nozioni di Programmazione
2. C++ elementi di un programma
3. Le istruzioni di I/O standard
5. C++ funzioni matematiche ed espressioni booleane
6. Le strutture di controllo - parte seconda
8. Array di caratteri e tipi astratti
9. Astrazione procedurale: Procedure e Funzioni
10. Astrazione procedurale: Procedure e Funzioni -parte seconda
11. Astrazione procedurale: Procedure e Funzioni - parte terza
12. Librerie
13. Le strutture di controllo - parte terza
14. Algoritmi
16. I File di testo
17. La classe string