1 of 35

STRINGHE

3^ INFORMATICO - IIS PASCAL�DIPARTIMENTO INFORMATICA

2 of 35

2

ARGOMENTI

  • Definizione di una stringa
  • Rappresentazione interna di una stringa
  • Stringhe in C mode vs Classe Stringa
  • Lettura di una stringa da input

3 of 35

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

4 of 35

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

5 of 35

Stringhe

stringhe in C standard

6 of 35

Alcune definizioni di stringhe

Il primo ed il terzo caso sono quelli corretti.

  • s contiene il carattere terminatore in modo esplicito
  • q contiene il carattere terminatore in modo implicito
  • t non contiene il carattere terminatore in modo esplicito ma C++ NON fa bound-checking! NON USARE
  • w è sintatticamente errato perché NON ha caratteri sufficienti.

Stringhe in C-mode

7 of 35

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

8 of 35

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

9 of 35

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

10 of 35

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

11 of 35

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

12 of 35

Esercizi

  1. scrivi una funzione stampaInversa che prende in input una stringa s �(rappresentata come char[ ]), e la sua lunghezza N, e la stampa al contrario
  2. scrivi una funzione copiaInversa che prende in input due stringhe s, t�(rappresentate come char[ ]), e copia in t il contenuto inverso di s�e la sua lunghezza, e la stampa al contrario
  3. scrivi una funzione void crittografa che prende in input una stringa s �(rappresentata come char[ ]), ed un numero intero N, e modifica il contenuto di s shiftando ogni carattere di N posizioni in avanti�es: se s = “ciao” ed N = 4 , s deve diventare gmes

La libreria string.h

13 of 35

Stringhe

La classe string

14 of 35

La classe string è un wrapper sulla rappresentazione standard

Stringhe in C++ ; la classe string

15 of 35

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:

  • accesso all’i-esimo carattere
  • accesso sequenziale
  • gestione del carattere terminatore

Stringhe in C++ ; la classe string

16 of 35

La sintassi di un oggetto di tipo string è la seguente (come un tipo dato qualsiasi)

Stringhe in C++ ; la classe string

17 of 35

Lunghezza di una stringa: metodo .length()

La libreria <string> (inclusa)

output:�22

18 of 35

Confronto fra stringhe: metodo .compare(string)

La libreria <string> (inclusa)

output:�0

4

19 of 35

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)

20 of 35

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)

21 of 35

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

22 of 35

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

23 of 35

Stringhe

input e output

24 of 35

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

25 of 35

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

26 of 35

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

27 of 35

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

28 of 35

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:

  • is è lo stream di input
  • str è la variabile stringa da leggere
  • delim è il carattere che vogliamo faccia da delimitatore di fine stringa (\n di default)

29 of 35

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

30 of 35

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

31 of 35

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*’|

32 of 35

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

33 of 35

Stringhe in C++ ; Esercizi

  1. Scrivi una funzione sostituisci(string s, char a, char b) che legge una stringa e due�caratteri e restituisce una nuova stringa dove tutti i caratteri a sono sostituiti da b�es: sostituisci(“provaci”, ‘p’, ‘t’) restituisce “trovaci”
  2. Scrivi una funzione contacar(string s, char a) che legge una stringa e un carattere e �restituisce quante volte a è presente in s�es: sostituisci(“tante”, ‘t’) restituisce 2
  3. Scrivi una funzione parole(string s, string v[ ], int &n) che legge una stringa s, un array di stringhe v e un intero e memorizza in esso tutte le parole contenute in s�es: parole(“Buon lavoro”, v, 0) restituisce un vettore v {“Buon”, “lavoro”} con n=2;

// dimensionare la stringa per una frasi di massimo 10 parole

soluzioni

34 of 35

Approfondimento

35 of 35

END OF SLIDES