• Non ci sono risultati.

Generalità del Tipo string in C++

N/A
N/A
Protected

Academic year: 2021

Condividi "Generalità del Tipo string in C++"

Copied!
17
0
0

Testo completo

(1)

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

(2)

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à

(3)

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à

(4)

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à

(5)

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];

(6)

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

(7)

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

(8)

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

(9)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 17

Lettura e Stampa delle Stringhe

m

Input non formattato

ðistruzione getline

m

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

(10)

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

(11)

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

(12)

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

(13)

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

(14)

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

(15)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 29

Funzioni Predefinite

m

Estrazione di sottostringa: s.substr(x,y)

ðrestituisce la sottostringa della stringa s fatta

di 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

(16)

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 nel

corrispondente 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

(17)

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.

Riferimenti

Documenti correlati

Non vi è un altro carattere (inizio stringa) Vi è un altro carattere, ma non è una lettera. Fine di parola: lettera, dopo la quale non vi è

I Quando si dichiara una funzione che prende come parametro un array multi-dimensionale, solo la prima dimensione pu` o essere lasciata non specificata..

Valutazione di codice con

Prima di chiamare la free sull'array chiamarla su ogni

JLK

(array di char o costante tra “..”), un carattere o ad un’altra variabile di tipo stringa. string nome1,

strncpy() Copia i primi n caratteri di una stringa in un’altra stringa strcat() Concatena due stringhe. strncat() Concatena i primi n caratteri di una stringa ad un’altra

¨  Nell’input di stringhe, la scanf scarta automaticamente i white space iniziali e continua a leggere fino a quando incontra un white space (quindi non si può usare la scanf