Programmazione Procedurale in
Linguaggio C++
Le Stringhe
versione 2.1
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons
(vedi ultima pagina)
G. Mecca – [email protected] – Università della Basilicata
Tipo Stringa >> Sommario
Sommario
 Generalità
del Tipo Stringa in C++
 Operazioni sulle Stringhe
 Funzioni Predefinite
 Lettura e Stampa delle Stringhe
 Un Altro Esempio: il FORTRAN 77
 Appendice
Dettagli sulle Funzioni Predefinite
G. Mecca - Programmazione Procedurale in Linguaggio C++
2
Tipo Stringa >> Generalità
Generalità del Tipo Stringa in C++
 Stringa
sequenza di caratteri racchiusa tra “ “
 Esempi:
“Mario Rossi”, “123”
“- - - - - - - - - >”, “risultato = “
“a”, “ ”, “*”
“”
 Differenza
con il tipo char
un singolo carattere (tra apici singoli)
G. Mecca - Programmazione Procedurale in Linguaggio C++
3
Tipo Stringa >> Generalità
Generalità

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
G. Mecca - Programmazione Procedurale in Linguaggio C++
4
Tipo Stringa >> Generalità
Generalità
 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
G. Mecca - Programmazione Procedurale in Linguaggio C++
5
Tipo Stringa >> Generalità
Generalità
 Altri
esempi di oggetti visti finora
i flussi (gli “stream”)
 cout
oggetto della classe ostream
 cin
oggetto della classe istream
i
flussi diretti ai file
oggetti delle classi ifstream, ofstream
G. Mecca - Programmazione Procedurale in Linguaggio C++
6
Tipo Stringa >> Generalità
Dichiarazione delle Variabili
 Sintassi
ordinaria
string <nomeVar>;
string <nomeVar1>, <nomeVar2>;
string <nomeVar> = <valoreIniziale>;
 Esempi:
string nome;
string nome, cognome;
string matricola = “S1234”;
const string cognome = “Rossi”;
G. Mecca - Programmazione Procedurale in Linguaggio C++
7
Tipo Stringa >> Generalità
Dichiarazione delle Variabili

Semantica
alla variabile viene assegnato uno spazio nella
memoria
lo spazio dipende dalla lunghezza della stringa

Lunghezza della stringa
numero di caratteri contenuti

Spazio di memoria iniziale
inizialmente la stringa viene considerata di
lunghezza 0
successivamente viene occupato lo spazio di
memoria necessario per rappresentare il valore
G. Mecca - Programmazione Procedurale in Linguaggio C++
8
Tipo Stringa >> Operazioni sulle Stringhe
Operazioni sulle Stringhe
 Espressioni
sulle stringhe
come per gli altri tipi di dato possono essere
operandi nelle espressioni
 Esistono
operatori predefiniti sulle stringhe
funzioni predefinite sulle stringhe
G. Mecca - Programmazione Procedurale in Linguaggio C++
9
Tipo Stringa >> Operazioni sulle Stringhe
Operatori sulle Stringhe

Accesso ai caratteri: s[i]
estrae il carattere in posizione i dalla stringa
il primo carattere è in posizione 0

Esempi
string s = “Prova “;
char c0 = s[0];
char c3 = s[3];
cout << c0 << “ “ << c3;

0
1
2
3
4
5
P r o v a
Schermo
Pv
Attenzione: è possibile anche eseguire:
char c = s[100];
cout << c << endl; // SCORRETTO
G. Mecca - Programmazione Procedurale in Linguaggio C++
10
Tipo Stringa >> Operazioni sulle Stringhe
Operatori sulle Stringhe
 Concatenazione:
+
concatena il valore di due stringhe
 Esempi
string p1 = “Questa è “;
string p2 = “una stringa”;
string p3;
p3 = p1 + p2;
cout << p3;
Questa è una stringa
G. Mecca - Programmazione Procedurale in Linguaggio C++
11
Tipo Stringa >> Operazioni sulle Stringhe
Operatori sulle Stringhe
 Confronti
confrontano i valori di due stringhe
ordinamento “lessicografico”
 Esempi
string p1 = “questa è “;
string p2 = “una stringa”;
p1 == p2;
// falso
p1 != p2;
// vero
p1 >= p2;
// falso
p1 <= p2;
// vero
G. Mecca - Programmazione Procedurale in Linguaggio C++
12
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite
 Sintassi
particolare:
<stringa>.<funzione>
es: string s; s.size();
 Nel
seguito
una funzione viene presentata in dettaglio
size: calcola la lunghezza della stringa
tutte le altre sono solo elencate (vedi
Appendice)
G. Mecca - Programmazione Procedurale in Linguaggio C++
13
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite
 Lunghezza:
s.size()
calcola la lunghezza della stringa s
 Esempi:
string s = “************”;
cout << s.size();
12
string cognome;
cout << cognome.size(); 0
G. Mecca - Programmazione Procedurale in Linguaggio C++
14
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite

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
G. Mecca - Programmazione Procedurale in Linguaggio C++
15
Tipo Stringa >> Lettura e Stampa delle Stringhe
Lettura e Stampa delle Stringhe
 Stampa
si effettua in modo ordinario (<<)
 Lettura
non è opportuno utilizzare l’operatore di
lettura (>>)
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
G. Mecca - Programmazione Procedurale in Linguaggio C++
16
Tipo Stringa >> Lettura e Stampa delle Stringhe
Lettura e Stampa delle Stringhe
 Input
non formattato
istruzione getline
 Sintassi
getline(<flusso>, <stringa>)
<stringa> è una variabile di tipo string
<flusso> è il flusso da cui leggere; es: cin
 Esempio
string s; getline(cin, s);
G. Mecca - Programmazione Procedurale in Linguaggio C++
17
Tipo Stringa >> Lettura e Stampa delle Stringhe
Input Non Formattato
 Semantica
preleva una riga di caratteri (spazi inclusi) dal
flusso di input e la assegna alla stringa
 Riga
di caratteri
tutti i caratteri presenti nel flusso fino al primo
carattere di fine riga (\n) incluso
 Attenzione
se nel flusso ci sono caratteri di fine riga
possono esserci situazioni inaspettate
G. Mecca - Programmazione Procedurale in Linguaggio C++
18
Tipo Stringa >> Lettura e Stampa delle Stringhe
Input Non Formattato
string s; getline(cin, s);
RAM
s:
Processore
Paolo Rossi \n
Dispositivo
di ingresso
(es: tastiera)
RAM
s: Paolo Rossi
Processore
Dispositivo
di ingresso
(es: tastiera)
ATTENZIONE: il carattere di fine riga viene eliminato
(ma solo in alcune versioni del compilatore; es: BCC 5.5.1)
G. Mecca - Programmazione Procedurale in Linguaggio C++
19
Tipo Stringa >> Lettura e Stampa delle Stringhe
Input Non Formattato
int i; string s;
cin >> i; getline(cin, s);
RAM
i: 2134567
s:
Processore
23 \n abc \n
Dispositivo
di ingresso
(es: tastiera)
abc \n
Dispositivo
di ingresso
(es: tastiera)
RAM
i: 23
s:
Processore
G. Mecca - Programmazione Procedurale in Linguaggio C++
20
Tipo Stringa >> Lettura e Stampa delle Stringhe
Input Non Formattato
 Problema
nel caso in cui si mischiano input diversi
ogni operazione di lettura formattata lascia
un carattere di fine riga nel flusso
 Soluzione
tutte le volte che un input non formattato è
stato preceduto da uno formattato è
necessario eliminare il carattere di fine riga
G. Mecca - Programmazione Procedurale in Linguaggio C++
21
Tipo Stringa >> Lettura e Stampa delle Stringhe
Input Non Formattato
 Operazione
ignore
serve ad eliminare il primo carattere di un
flusso
 Sintassi
<flusso>.ignore()
dove <flusso> è il flusso in questione; es: cin
 Semantica
scarta il primo carattere contenuto nel flusso
G. Mecca - Programmazione Procedurale in Linguaggio C++
22
Tipo Stringa >> Lettura e Stampa delle Stringhe
Input Non Formattato
RAM
int i; string s;
cin >> i; cin.ignore();
getline(cin, s);
i: 2134567
s:
Processore
23 \n abc \n
Dispositivo
di ingresso
(es: tastiera)
RAM
i: 23
s: abc
Processore
G. Mecca - Programmazione Procedurale in Linguaggio C++
Dispositivo
di ingresso
(es: tastiera)
23
Tipo Stringa >> FORTRAN
Un Altro Esempio: il FORTRAN 77
 In
FORTRAN
il tipo utilizzato per le stringhe è una variante
del tipo CHARACTER utilizzato per i caratt.
 Sintassi
character*<lung> <variabile>
dove <lung> è la lunghezza massima per le
stringhe
 Esempio
character*10 nome
G. Mecca - Programmazione Procedurale in Linguaggio C++
24
Tipo Stringa >> FORTRAN
Un Altro Esempio: il FORTRAN 77
 Principali
operazioni sulle stringhe in
FORTRAN
assegnazione
concatenazione
estrazione di carattere
estrazione di sottostringa
calcolo della lunghezza
G. Mecca - Programmazione Procedurale in Linguaggio C++
25
Tipo Stringa >> FORTRAN
Un Altro Esempio: il FORTRAN 77
 Assegnazione
character*10 nome
nome = ‘Franco’
 Concatenazione:
//
character*10 nome, cognome, s
nome = ‘Franco’
cognome = ‘Rossi’
s = nome // ‘ ‘ // cognome
il valore di s è ‘Franco Rossi’
G. Mecca - Programmazione Procedurale in Linguaggio C++
26
Tipo Stringa >> FORTRAN
Un Altro Esempio: il FORTRAN 77
 Estrazione
di carattere
a differenza del C++ in FORTRAN i caratteri
delle stringhe sono numerati a partire da 1
character*10 nome
character c, d
nome = ‘Franco’
c = nome(1:1)
d = nome(5:5)
in questo caso c vale ‘F’ e d vale ‘o’
G. Mecca - Programmazione Procedurale in Linguaggio C++
27
Tipo Stringa >> FORTRAN
Un Altro Esempio: il FORTRAN 77
 Estrazione
di sottostringa
stessa sintassi che per i caratteri, ma con
indici diversi
character*10 nome
character*2 c
nome = ‘Franco’
c = nome(1:2)
in questo caso c vale ‘Fr’
G. Mecca - Programmazione Procedurale in Linguaggio C++
28
Tipo Stringa >> FORTRAN
Un Altro Esempio: il FORTRAN 77
 Calcolo
della lunghezza: LEN
esiste una funzione predefinita per il calcolo
della lunghezza di una stringa
ma il risultato è banale: NON restituisce la
lunghezza effettiva, ma la lungh. massima
dichiarata
character*10 nome
nome = ‘Franco’
write(*,*) len(nome)
in questo caso viene stampato il valore 10
G. Mecca - Programmazione Procedurale in Linguaggio C++
29
Tipo Stringa >> Sommario
Riassumendo
 Generalità
del Tipo Stringa
 Operazioni sulle Stringhe
 Funzioni Predefinite
 Lettura e Stampa delle Stringhe
 Un Altro Esempio: il FORTRAN 77
G. Mecca - Programmazione Procedurale in Linguaggio C++
30
Tipo Stringa >> Appendice
Appendice

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
G. Mecca - Programmazione Procedurale in Linguaggio C++
31
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite
 Lunghezza:
s.size()
calcola la lunghezza della stringa s
 Esempi:
string s = “************”;
cout << s.size();
12
string cognome;
cout << cognome.size(); 0
G. Mecca - Programmazione Procedurale in Linguaggio C++
32
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite
 Inserimento:
s.insert(x, s1)
inserisce la stringa s1 nella stringa s prima
della posizione x
 Esempi
string s = “Mario Rossi”;
cout << s.insert(10,”in”);
Mario Rossini
G. Mecca - Programmazione Procedurale in Linguaggio C++
33
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite
 Cancellazione:
s.erase(x, y)
cancella x caratteri dalla stringa s a partire
dalla posizione y
 Esempio
string s0 = “Mario Rossi”;
cout << s0.erase(3,3);
MarRossi
G. Mecca - Programmazione Procedurale in Linguaggio C++
34
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite
 Estrazione
di sottostringa: s.substr(x,y)
restituisce la sottostringa della stringa s fatta
di y caratteri a partire dalla posizione x
 Esempi:
string s = “Mario Rossi”;
string p1 = s.substr(6,4);
cout << p1;
Rossi
G. Mecca - Programmazione Procedurale in Linguaggio C++
35
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite
 Ricerca
di sottostringa: s.find(s1)
restituisce la posizione della sottostringa s1
 Esempio
string s0 = “Alex Del Piero”;
cout << s0.find(“el”);
6
G. Mecca - Programmazione Procedurale in Linguaggio C++
36
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite
 Sostituzione:
s.replace(x, y, s1)
sostituisce nella stringa s y caratteri a partire
dalla posizione x con la stringa s1
 Esempi:
string s = “Mario Rossi”;
cout << s.replace(3,3,”ta e Tina”);
Marta e Tina Rossi
G. Mecca - Programmazione Procedurale in Linguaggio C++
37
Tipo Stringa >> Funzioni Predefinite
Funzioni Predefinite
 Trasformazione
in stringa C: c_str()
trasforma un valore di tipo string nel
corrispondente valore di tipo “stringa C”
indispensabile per usare funzioni e
procedure che prevedono argomenti che
sono stringhe C
 Esempio:
creazione di un flusso su file
string nomeFile;
cin >> nomeFile;
ifstream flussoDaFile(nomeFile.c_str());
G. Mecca - Programmazione Procedurale in Linguaggio C++
38
Ringraziamenti
Ringraziamenti

Parte del materiale di questa lezione è stato sviluppato con la
collaborazione della Dott.ssa Maria Samela
([email protected]), a cui va il mio ringraziamento.
G. Mecca - Programmazione Procedurale in Linguaggio C++
39
Termini della Licenza
Termini della Licenza

This work is licensed under the Creative Commons AttributionShareAlike 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.

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.
G. Mecca - Programmazione Procedurale in Linguaggio C++
40
Scarica

Programmazione Procedurale in Linguaggio C++