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