STRINGHE
3^ INFORMATICO - IIS PASCAL�DIPARTIMENTO INFORMATICA
2
ARGOMENTI
3
DEFINIZIONE
“”Una stringa in informatica è una sequenza di caratteri con un ordine prestabilito. Sequenze di altri tipi di dato vengono chiamati vettori o, in inglese, array.1
Rappresentazione interna
Ogni stringa di caratteri è un array di caratteri terminato dal carattere \0
IMPORTANTE: Se definisco la stringa in formato ESPLICITO (con char[ ]) DEVO prevedere un carattere in più per il fine stringa
Stringhe
stringhe in C standard
Alcune definizioni di stringhe
Il primo ed il terzo caso sono quelli corretti.
Stringhe in C-mode
Libreria del C standard per la manipolazione di stringhe
strcpy(char[ ] s2, char[ ] s1);
// copia la stringa s1 in s2
La libreria string.h
output:�prima: ��w
dopo : ciao
Libreria del C standard per la manipolazione di stringhe
strcat(char[ ] s1, char[ ] s2);
// concatena la stringa s2 ad s1
La libreria string.h
output:�ciaoragazzi
Libreria del C standard per la manipolazione di stringhe
strcmp(char[ ] s1, char[ ] s2);
// confronta la stringa s1 e la s2
se sono uguali restituisce 0
La libreria string.h
output:�0
Libreria del C standard per la manipolazione di stringhe
strcmp(char[ ] s1, char[ ] s2);
// confronta la stringa s1 e la s2
se NON sono uguali restituisce un numero diverso da 0…
perché 15 e -4 in questi casi? Qualche idea ?
La libreria string.h
output:�15
output:�-4
Libreria del C standard per la manipolazione di stringhe
strlen(char[ ] s1);
// restituisce la lunghezza di una stringa
La lunghezza della stringa è 5, la dimensione è 6. Perchè?��per approfondire: https://cplusplus.com/reference/cstring/
La libreria string.h
output:�5
6
Esercizi
La libreria string.h
Stringhe
La classe string
La classe string è un wrapper sulla rappresentazione standard
Stringhe in C++ ; la classe string
La classe string è un wrapper sulla rappresentazione standard e permette l’accesso alla struttura dati tramite una serie di metodi più comodi.
Rimane la possibilità di considerare una stringa come �array di char con tutto quello che ne segue:
Stringhe in C++ ; la classe string
La sintassi di un oggetto di tipo string è la seguente (come un tipo dato qualsiasi)
Stringhe in C++ ; la classe string
Lunghezza di una stringa: metodo .length()
La libreria <string> (inclusa)
output:�22
Confronto fra stringhe: metodo .compare(string)
La libreria <string> (inclusa)
output:�0
4
Inserimento in una stringa: metodo .insert(int, string)
La libreria <string> (inclusa)
output:�CiaoRagaz!
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::replace: __pos (which is 5) > this->size() (which is 4)
Aborted (core dumped)
Sottostringa di una stringa: metodo .substr(int, string)
La libreria <string> (inclusa)
output:�bello
il C++
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr: __pos (which is 18446744073709551615) > this->size() (which is 16)
Aborted (core dumped)
Ricerca di una sottostringa in una stringa: metodo .find(string)
Se la stringa cercata esiste, il metodo restituisce l’indice del carattere di partenza�Nel primo caso restituisce 3 ananasso
Se non esiste restituisce il valore speciale string::npos � (che viene stampato come valore molto alto 18446744073709551615)
La libreria <string> (inclusa)
output:�nas in ananasso : 3
nope in ananasso : 18446744073709551615
Eliminazione di una sottostringa da una stringa: metodo .erase(int, int)
�Cancello dal carattere in posizione 3 al carattere in posizione 6
Se non specifico il secondo parametro
elimina fino alla fine della stringa
La libreria <string> (inclusa)
output:�Oggro il C++
output:�Ogg
Stringhe
input e output
Stringhe in C++ ; Lettura di stringhe
Abbiamo visto da sempre cin e cout
Sono funzioni polimorfe per input e output da stream (console, file, rete…)
Alcuni esempi:
output:�1 2�A B�1 2 A B
Stringhe in C++ ; Lettura di stringhe
Ci sono però dei comportamenti “strani”....
proviamo le seguenti istruzioni…
string s;�cout << “Inserisci il tuo nome: “;
cin >> s;�cout << “Ciao, “ << s;
inserendo come input la stringa “Francesco” otterremo
e tutto sembra correttissimo…
output:�Ciao, Francesco
Stringhe in C++ ; Lettura di stringhe
Ci sono però dei comportamenti “strani”....
proviamo le seguenti istruzioni…
string s;�cout << “Inserisci il tuo nome: “;
cin >> s;�cout << “Ciao, “ << s;
inserendo come input la stringa “Francesco” otterremo
e tutto sembra correttissimo…
output:�Ciao, Francesco
Stringhe in C++ ; Lettura di stringhe
Ci sono però dei comportamenti “strani”....
proviamo adesso le seguenti istruzioni…
string s;�cout << “Inserisci il tuo nome: “;
cin >> s;�cout << “Ciao, “ << s;
inserendo come input la stringa “Antonio Maria” otterremo
!! Non va bene! Dove è finito il resto della stringa?
output:�Ciao, Antonio
Stringhe in C++ ; Lettura di stringhe
Cosa è successo? �Il problema nasce dal fatto che, quando si legge uno stream, �per esempio quando si effettua un input da tastiera o si legge �un file di testo, se lo stream di input contiene caratteri quali �spazi, tabulazioni (‘\t’ – tasto tab) o nuova linea (‘\n’ – tasto invio), �questi vengono interpretati dall’operatore di lettura C++ (>>)�e dalla funzione scanf() del C, come dei caratteri di fine stringa.
Dobbiamo quindi utilizzare la funzione getline che ha la seguente sintassi:
getline (istream& is, string& str, char delim);
dove:
Stringhe in C++ ; Lettura di stringhe
Proviamo adesso:
string s;�cout << “Inserisci il tuo nome: “;
getline(cin, s);�
inserendo come input la stringa “Antonio Maria” otterremo
che è esattamente quello che vogliamo ottenere!
output:�Ciao, Antonio Maria
Stringhe in C++ ; Lettura di stringhe
Altro esempio:
string n, c;�cout << “Inserisci il tuo nome e cognome divisi da virgola: “;
getline(cin, n, ‘,’);�getline(cin, c); // getline(cin, c, ‘\n’);
cout << “Nome: “ << n << endl;�cout << “Cognome: “ << c << endl;�
inserendo “Marco,Rossi” e premendo INVIO come input
getline ha letto lo stream separando le due stringhe al separatore “,” come indicato�Per la seconda lettura il separatore è quello di default ( fine riga )
output:�Nome: Marco�Cognome: Rossi
Stringhe in C++ ; Conversione
Abbiamo visto che fra C++ e C le stringhe sono rappresentate in maniera un po’ diversa
Può succedere di dover utilizzare funzioni C da programmi C++.�Vediamo l’esempio:
otteniamo in compilazione…
output:�/home/giulio/Documenti/Didattica/Scuola/Didattica/Dispense/01_Informatica/__3_INFO/3INFO_Stringhe_01/main.cpp|90|error: cannot convert ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} to ‘const char*’|
Stringhe in C++ ; Conversione
L’errore è dovuto alla diversa rappresentazione dell’oggetto stringa:�E’ possibile convertire una string C++ in una char* C con il metodo c_str()
non otteniamo alcun errore� in compilazione e l’output atteso
output:�M
Stringhe in C++ ; Esercizi
// dimensionare la stringa per una frasi di massimo 10 parole
Approfondimento
END OF SLIDES