G. Mecca – mecca@unibas.it – Università della Basilicata
Programmazione Procedurale in Linguaggio C++
Le Stringhe Parte 1 Il Tipo string
versione 2.1
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Sommario
m
Generalità del Tipo string in C++
m
Operazioni sulle Stringhe
m
Funzioni Predefinite
m
Lettura e Stampa delle Stringhe
m
Appendice
ðDettagli sulle Funzioni Predefinite
Stringhe: Tipo string >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Generalità del Tipo string in C++
m
Stringa
ðsequenza di caratteri racchiusa tra “ “
m
Esempi:
ð“Mario Rossi”, “123”
ð“- - - >”, “risultato = “ ð“a”, “ ”, “*”
ð“”
m
Differenza con il tipo char
ðun singolo carattere (tra apici singoli)
Stringhe: Tipo string >> Generalità
Generalità
m Attenzione
ðil tipo string è stato introdotto esplicitamente in C++
ðin C non esiste il tipo string e la gestione delle stringhe è decisamente più complessa
ðper compatibilità, in C++ esistono sia le stringhe “in stile C” (o “stringhe c”), che le stringhe di tipo string ðdiverse rappresentazioni in memoria
ðè possibile trasformare la rappresentazione di una stringa nell’altra
Stringhe: Tipo string >> Generalità
G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
Generalità
m
Peculiarità del tipo string
ðil tipo stringa non è un tipo predefinito del C++ (come int o char)
ðsi tratta in realtà di una classe di oggetti (nel senso della prog. orientata agli oggetti)
ðdi conseguenza le stringhe vengono manipolate in modo leggermente diverso ðoperazioni basate sull’uso del punto (.),
diverse da quelle sui tipi di base
Stringhe: Tipo string >> Generalità
Generalità
m
Altri esempi di oggetti visti finora
ði flussi (gli “stream”)m
cout
ðoggetto della classe ostream
m
cin
ðoggetto della classe istream
m
i flussi diretti ai file
ðoggetti delle classi ifstream, ofstream
Stringhe: Tipo string >> Generalità
G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Dichiarazione delle Variabili
m
Sintassi ordinaria
ðstring <nomeVar>;
ðstring <nomeVar1>, <nomeVar2>;
ðstring <nomeVar> = <valoreIniziale>;
m
Esempi:
ðstring nome;
ðstring nome, cognome;
ðstring matricola = “S1234”;
ðconst string cognome = “Rossi”;
Stringhe: Tipo string >> Generalità
Dichiarazione delle Variabili
m Semantica
ðalla variabile viene assegnato uno spazio nella memoria
ðlo spazio dipende dalla lunghezza della stringa
m Lunghezza della stringa
ðnumero di caratteri contenuti
m Spazio di memoria iniziale
ðinizialmente la stringa viene considerata di lunghezza 0
ðsuccessivamente viene occupato lo spazio di memoria necessario per rappresentare il valore
Stringhe: Tipo string >> Generalità
G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Operazioni sulle Stringhe
m
Espressioni sulle stringhe
ðcome per gli altri tipi di dato possono essere operandi nelle espressioni
m
Esistono
ðoperatori predefiniti sulle stringhe ðfunzioni predefinite sulle stringhe
Stringhe: Tipo string >> Operazioni sulle Stringhe
Operatori sulle Stringhe
m Accesso ai caratteri: s[i]
ðestrae il carattere in posizione i dalla stringa ðil primo carattere è in posizione 0
m Esempi
string s = “Prova “;
char c0 = s[0];
char c3 = s[3];
cout << c0 << “ “ << c3;
m Attenzione: è possibile anche eseguire:
char c = s[100];
cout << c << endl; // SCORRETTO Stringhe: Tipo string >> Operazioni sulle Stringhe
a v o r P
5 4 3 2 1 0
P v
Schermo ATTENZIONE:
posso anche scrivere int i = 2;
string s = “Prova”;
char c = s[i + 1];
G. Mecca - Programmazione Procedurale in Linguaggio C++ 11
Operatori sulle Stringhe
m
Concatenazione: +
ðconcatena il valore di due stringhe
m
Esempi
string p1 = “Questa e’ “;
string p2 = “una stringa”;
string p3;
p3 = p1 + p2;
cout << p3;
Stringhe: Tipo string >> Operazioni sulle Stringhe
Questa e’ una stringa
Operatori sulle Stringhe
m
Confronti
ðconfrontano i valori di due stringhe ðordinamento “lessicografico”
m
Esempi
string p1 = “questa e’ “;
string p2 = “una stringa”;
p1 == p2; // falso
p1 != p2; // vero
p1 >= p2; // falso p1 <= p2; // vero
Stringhe: Tipo string >> Operazioni sulle Stringhe
G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Funzioni Predefinite
m
Sintassi particolare:
<stringa>.<funzione>
ðes: string s; s.size();
m
Nel seguito
ðuna funzione viene presentata in dettaglio ðsize: calcola la lunghezza della stringa ðtutte le altre sono solo elencate (vedi
Appendice)
Stringhe: Tipo string >> Funzioni Predefinite
Funzioni Predefinite
m
Lunghezza: s.size()
ðcalcola la lunghezza della stringa s
m
Esempi:
string s = “************”;
cout << s.size();
string cognome;
cout << cognome.size();
Stringhe: Tipo string >> Funzioni Predefinite
12 0
G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Funzioni Predefinite
m Altre funzioni
ðs.insert(x, s1): inserimento di una stringa in un’altra ðs.erase(x, y): cancellazione di una sottostringa ðs.substr(x, y): estrazione di una sottostringa
ðs.find(s1): ricerca della posizione di una sottostringa ðs.replace(x, y, s1): sostituzione di una sottostringa
con un’altra
ðs.c_str(): cambia la rappresentazione di un valore da string ad una stringa del C
Stringhe: Tipo string >> Funzioni Predefinite
Lettura e Stampa delle Stringhe
m
Stampa
ðsi effettua in modo ordinario (<<)
m
Lettura
ðnon è opportuno utilizzare l’istruzione di lettura per l’input formattato (cin >>)
ðl’input formattato elimina gli spazi che nelle stringhe sono rilevanti (es: “Paolo Rossi”) ðviene utilizzata una modalità diversa, in cui
l’input non viene formattato
Stringhe: Tipo string >> Lettura e Stampa delle Stringhe
G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Lettura e Stampa delle Stringhe
m
Input non formattato
ðistruzione getlinem
Sintassi
getline(<flusso>, <stringa>)
<stringa> è una variabile di tipo string
<flusso> è il flusso da cui leggere; es: cin
m
Esempio
string s; getline(cin, s);
Stringhe: Tipo string >> Lettura e Stampa delle Stringhe
Input Non Formattato
m
Semantica
ðpreleva una riga di caratteri (spazi inclusi) dal flusso di input e la assegna alla stringa
m
Riga di caratteri
ðtutti i caratteri presenti nel flusso fino al primo carattere di fine riga (\n) incluso
m
Attenzione
ðse nel flusso ci sono caratteri di fine riga possono esserci situazioni inaspettate
Stringhe: Tipo string >> Lettura e Stampa delle Stringhe
G. Mecca - Programmazione Procedurale in Linguaggio C++ 19
Input Non Formattato
Stringhe: Tipo string >> Lettura e Stampa delle Stringhe
Processore
Dispositivo di ingresso (es: tastiera)
Paolo Rossi \n
string s; getline(cin, s);
s:
RAM
Processore
Dispositivo di ingresso (es: tastiera) s: Paolo Rossi
RAM
ATTENZIONE: il carattere di fine riga viene eliminato (ma solo in alcune versioni del compilatore; es: BCC 5.5.1)
Input Non Formattato
Stringhe: Tipo string >> Lettura e Stampa delle Stringhe
Processore
Dispositivo di ingresso (es: tastiera)
abc \n
s:
i: 23 RAM
int i; string s;
cin >> i; getline(cin, s);
Processore
Dispositivo di ingresso (es: tastiera)
23 \n abc \n
s:
i: 2134567 RAM
G. Mecca - Programmazione Procedurale in Linguaggio C++ 21
Input Non Formattato
m
Problema
ðnel caso in cui si mischiano input diversi ðogni operazione di lettura formattata lascia
un carattere di fine riga nel flusso
m
Soluzione
ðtutte le volte che un input non formattato è stato preceduto da uno formattato è
necessario eliminare il carattere di fine riga
Stringhe: Tipo string >> Lettura e Stampa delle Stringhe
Input Non Formattato
m
Operazione ignore
ðserve ad eliminare il primo carattere di un flusso
m
Sintassi
<flusso>.ignore()
dove <flusso> è il flusso in questione; es: cin
m
Semantica
ðscarta il primo carattere contenuto nel flusso
Stringhe: Tipo string >> Lettura e Stampa delle Stringhe
G. Mecca - Programmazione Procedurale in Linguaggio C++ 23
Input Non Formattato
Stringhe: Tipo string >> Lettura e Stampa delle Stringhe
Processore
Dispositivo di ingresso (es: tastiera) s: abc
i: 23 RAM
int i; string s;
cin >> i; cin.ignore();
getline(cin, s);
Processore
Dispositivo di ingresso (es: tastiera)
23 \n abc \n
s:
i: 2134567 RAM
Riassumendo
m
Generalità del Tipo string in C++
m
Operazioni sulle Stringhe
m
Funzioni Predefinite
m
Lettura e Stampa delle Stringhe
Stringhe: Tipo string >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 25
Appendice
m Funzioni Predefinite sulle Stringhe
ðs.size(): calcola la lunghezza della stringa
ðs.insert(x, s1): inserimento di una stringa in un’altra ðs.erase(x, y): cancellazione di una sottostringa ðs.substr(x, y): estrazione di una sottostringa
ðs.find(s1): ricerca della posizione di una sottostringa ðs.replace(x, y, s1): sostituzione di una sottostringa
con un’altra
ðs.c_str(): cambia la rappresentazione di un valore da string ad una stringa del C
Stringhe: Tipo string >> Appendice
Funzioni Predefinite
m
Lunghezza: s.size()
ðcalcola la lunghezza della stringa s
m
Esempi:
string s = “************”;
cout << s.size();
string cognome;
cout << cognome.size();
Stringhe: Tipo string >> Funzioni Predefinite
12 0
G. Mecca - Programmazione Procedurale in Linguaggio C++ 27
Funzioni Predefinite
m
Inserimento: s.insert(x, s1)
ðinserisce la stringa s1 nella stringa s prima della posizione x
m
Esempi
string s = “Mario Rossi”;
cout << s.insert(10,”in”);
Stringhe: Tipo string >> Funzioni Predefinite
Mario Rossini
Funzioni Predefinite
m
Cancellazione: s.erase(x, y)
ðcancella x caratteri dalla stringa s a partire dalla posizione y
m
Esempio
string s0 = “Mario Rossi”;
cout << s0.erase(3,3);
Stringhe: Tipo string >> Funzioni Predefinite
MarRossi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 29
Funzioni Predefinite
m
Estrazione di sottostringa: s.substr(x,y)
ðrestituisce la sottostringa della stringa s fattadi y caratteri a partire dalla posizione x
m
Esempi:
string s = “Mario Rossi”;
string p1 = s.substr(6,5);
cout << p1;
Stringhe: Tipo string >> Funzioni Predefinite
Rossi
Funzioni Predefinite
m
Ricerca di sottostringa: s.find(s1)
ðrestituisce la posizione della sottostringa s1
m
Esempio
string s0 = “Alex Del Piero”;
cout << s0.find(“el”);
Stringhe: Tipo string >> Funzioni Predefinite
6
G. Mecca - Programmazione Procedurale in Linguaggio C++ 31
Funzioni Predefinite
m
Sostituzione: s.replace(x, y, s1)
ðsostituisce nella stringa s y caratteri a partire dalla posizione x con la stringa s1
m
Esempi:
string s = “Mario Rossi”;
cout << s.replace(3,3,”ta e Tina”);
Stringhe: Tipo string >> Funzioni Predefinite
Marta e Tina Rossi
Funzioni Predefinite
m
Trasformazione in stringa C: c_str()
ðtrasforma un valore di tipo string nelcorrispondente valore di tipo “stringa C”
ðindispensabile per usare funzioni e
procedure che prevedono argomenti che sono stringhe C
m
Esempio: creazione di un flusso su file
string nomeFile;
cin >> nomeFile;
ifstream flussoDaFile(nomeFile.c_str());
Stringhe: Tipo string >> Funzioni Predefinite
G. Mecca - Programmazione Procedurale in Linguaggio C++ 33
Ringraziamenti
m Parte del materiale di questa lezione è stato sviluppato con la collaborazione della Dott.ssa Maria Samela
(mariasamela@tiscali.it), a cui va il mio ringraziamento.
Ringraziamenti
Termini della Licenza
m This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
Termini della Licenza
m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare
http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.