Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Scienze Matematiche Fisiche e Naturali
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Silvia Rossi » 17.La classe string


Oggetti string

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:

  • Passaggio di stringhe per valore (copia) nelle chiamate di funzione
  • Maggiore semplicità di gestione

La classe string definisce molti metodi per la manipolazione di stringhe
Alcuni operatori base possono essere usati su stringhe come se fossero tipi nativi

  • Confronto di stringhe (=)
  • Concatenazione (+)

Oggetti string → definizione


Oggetti string → definizione (segue)


Oggetti string → input-output

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)

Oggetti string → input-output

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)

Oggetti string → concatenazione

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”;

Oggetti string _ confronto

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);

Oggetti string _ confronto

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”;

Accesso agli elementi di una stringa

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’

Oggetti string _ inserimento

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

Oggetti string _ ricerca

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;

Oggetti string _ sostituzione

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;

Esempio (segue)

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″.

Esempio (segue)

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.


Esempio (segue)

Il primo raffinamento dell’algoritmo risolutivo è come nella figura a lato:


Esempio (segue)

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:

  • il nome del file fisico deve essere del tipo array di char;
  • la funzione c_str() applicata ad una stringa di tipo string restituisce una stringa come array;
  • la stringa letta dal file deve essere una stringa di tipo array;
  • vengono utilizzati diversi metodi.

Esempio (segue)


Esempio (segue)



  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion