Sei sulla pagina 1di 49

Caratteri e stringhe

Dati testuali
Il tipo char
Vettori di caratteri
Operazioni elementari sulle stringhe
Funzioni di libreria
Programmazione in C Esercizi proposti
Sommario

Riferimenti al materiale

Testi
Kernighan & Ritchie: capitoli 1 e 5
Cabodi, Quer, Sonza Reorda: capitolo 5
Dietel & Dietel: capitolo 8
Dispense
Scheda: Caratteri e stringhe in C

3
Dati testuali

Tipi di dato testuali


Caratteri
Stringhe

Caratteri e stringhe

Tipi di dato testuali

I programmi visti finora erano in grado di


elaborare esclusivamente informazioni numeriche
Numeri interi (int), numeri reali (float)
Variabili singole o vettori
In molti casi necessario elaborare informazioni
Dati testuali di tipo testuale
Vuoi continuare (s/n)?
Conta le parole di un testo scritto
Gestisci una rubrica di nomi e numeri di telefono
...

Il sistema dei tipi C Rappresentazione dei testi

Il calcolatore in grado di rappresentare i


Tipo di dato caratteri alfabetici, numerici ed i simboli speciali
Tipi Scalari Tipi Strutturati void
di punteggiatura
Tipi interi Tipi reali Enumerazioni Vettori Ad ogni diverso carattere viene assegnato,
char float Strutture
convenzionalmente, un codice numerico
corrispondente
int double Union
Il programma in C lavora sempre con i codici
short/long long Puntatori
numerici
Funzioni
signed/unsigned Le funzioni di input/output sono in grado di
accettare e mostrare i caratteri corrispondenti

8 9
Codice ASCII Caratteri e stringhe

Il codice ASCII permette di rappresentare un


singolo carattere

y 7 W ! %

Nelle applicazioni pratiche spesso serve


rappresentare sequenze di caratteri: stringhe

F u l v i o 0 6 A Z N

0 1 1 - 5 6 4 6 3 3 2
10 11
Source: www.lookuptables.com

Dualit caratteri - numeri

Ogni carattere rappresentato dal suo codice


ASCII

y 7 W ! %
121 55 87 33 37

Ogni stringa rappresentata dai codici ASCII dei Dati testuali


caratteri di cui composta

F u l v i o 0 6 A Z N
70 117 108 118 105 111 48 54 65 90 78

0 1 1 - 5 6 4 6 3 3 2
12
48 49 49 45 53 54 52 54 51 51 50

Caratteri in C Codice ASCII

Ogni carattere viene rappresentato dal proprio


codice ASCII
Sono sufficienti 7 bit per rappresentare ciascun
carattere
Il C usa variabili di 8 bit (1 byte)
Non sono previste le lettere accentate n altri
simboli diacritici
Richiedono estensioni speciali e librerie specifiche

14 15
Source: www.lookuptables.com
Codice ASCII Codice ASCII

Simbolo Lettere
corrispondente minuscole

Lettere
Valore decimale maiuscole
(tra 0 e 127)

16 17
Source: www.lookuptables.com Source: www.lookuptables.com Source: www.lookuptables.com

Codice ASCII Codice ASCII

Cifre
numeriche Spazio
Simboli di bianco
punteggiatura

Caratteri di
controllo

Source: www.lookuptables.com 18 19
Source: www.lookuptables.com Source: www.lookuptables.com

Caratteristiche del codice ASCII Caratteri di controllo

Le lettere maiuscole sono tutte consecutive, ed in Caratteri speciali, non visualizzabili


ordine alfabetico Rappresentano comandi di stampa, e non simboli
Le lettere minuscole sono tutte consecutive, ed in da stampare
ordine alfabetico Esempi:
Le lettere maiuscole vengono prima delle 7 BEL: emetti un bip
minuscole 8 BS: cancella lultimo carattere
Le cifre numeriche sono tutte consecutive, in 10 LF: avanza di una riga
ordine dallo 0 al 9 13 CR: torna alla prima colonna
I simboli di punteggiatura sono sparsi 27 ESC: tasto Esc
Per alcuni esiste una sequenza di escape in C: \n
20 21
Errore frequente Errore frequente

Non confondere il carattere ASCII che Pensare che un singolo carattere possa
rappresenta una cifra numerica con il valore memorizzare pi simboli
decimale associato a tale cifra
int char
char char char char
7 7
Fulvio 7
F 7
u 7
l
55
55 117 108
Per chiarezza useremo gli apici per indicare i
caratteri
char
'7'
55
22 23

Stringhe

Una stringa una struttura dati capace di


memorizzare sequenze di caratteri
In C non esiste un tipo di dato specifico
Si usano vettori di caratteri
La lunghezza di una stringa tipicamente
Dati testuali variabile durante lesecuzione del programma
Occorrer gestire loccupazione variabile dei
vettori di caratteri

25

Caratteristiche delle stringhe Manipolazione delle stringhe

Memorizzate come singoli caratteri, ma il loro Occorre trattare linsieme di caratteri


significato dato dallintera sequenza di caratteri memorizzato nel vettore come ununica
Lunghezza variabile variabile
Mix di lettere/cifre/punteggiatura/spazi Ogni operazione elementare sulle stringhe
Solitamente non contengono caratteri di controllo coinvolger tipicamente dei cicli che scandiscono
il vettore
Molte funzioni di libreria sono gi disponibili per
F u l v i o 0 6 A Z N compiere le operazioni pi frequenti ed utili
70 117 108 118 105 111 48 54 65 90 78

0 1 1 - 5 6 4 6 3 3 2
48 49 49 45 53 54 52 54 51 51 50

26 27
Errore frequente

Non confondere una stringa composta da cifre


numeriche con il valore decimale associato a tale
sequenza

int char
137 1 3
7 7
49 51 55

28
Il tipo char

Variabili char
Input/output di char
Operazioni sui char
Esercizio Quadrati di lettere

Caratteri e stringhe

Variabili char

I caratteri in C si memorizzano in variabili di tipo


char

char lettera ;

Il tipo char Le costanti di tipo char si indicano ponendo il


simbolo corrispondente tra singoli apici

lettera = 'Q' ;

Apici Dualit dei char

Non confondere i 3 tipi di apici presenti sulla Sintatticamente, i char non sono altro che degli
tastiera: int di piccola dimensione
Ogni operazione possibile su un int, anche
Apice singolo ' In C, delimita singoli caratteri possibile su un char
(apostrofo) Ovviamente solo alcune di tali operazioni avranno
Apice doppio " In C, delimita stringhe di senso sullinterpretazione testuale (ASCII) del
(virgolette) caratteri valore numerico
Apice rovesciato ` Non utilizzato in C
(accento grave)

5 6
Esempi Esempi

int i ; int i ;
char c ; char c ;

c = 'A' ; c = 'A' ;
c = 65 ; /* equivalente! */

7 8

Esempi Esempi

int i ; int i ;
char c ; char c ;

c = 'A' ; c = 'A' ;
c = 65 ; /* equivalente! */ c = 65 ; /* equivalente! */
i = c ; /* i sar 65 */ i = c ; /* i sar 65 */
c = c + 1 ; /* c sar 66 = 'B' */

9 10

Esempi Esempi

int i ; int i ;
char c ; char c ;

c = 'A' ; c = 'A' ;
c = 65 ; /* equivalente! */ c = 65 ; /* equivalente! */
i = c ; /* i sar 65 */ i = c ; /* i sar 65 */
c = c + 1 ; /* c sar 66 = 'B' */ c = c + 1 ; /* c sar 66 = 'B' */
c = c * 2 ; /* non ha senso... */ c = c * 2 ; /* non ha senso... */
if (c == 'Z') ...

11 12
Esempi Caratteri speciali

int i ; Per alcuni caratteri di controllo il linguaggio C


char c ; definisce una particolare sequenza di escape
per poterli rappresentare
c = 'A' ; C ASCII Significato
c = 65 ; /* equivalente! */ '\n' LF 10 A capo
i = c ; /* i sar 65 */ '\t' TAB 9 Tabulazione
c = c + 1 ; /* c sar 66 = 'B' */ '\b' BS 8 Backspace cancella ultimo car.
c = c * 2 ; /* non ha senso... */
'\a' BEL 7 Emette un bip
if (c == 'Z') ...
'\r' CR 13 Torna alla prima colonna
for(
for c='A'; c<='Z'; c++) ...
13 14

Punteggiatura speciale in C

Alcuni caratteri hanno un significato particolare


dentro gli apici. Per poterli inserire come
carattere esistono apposite sequenze di escape

C ASCII Significato
'\\' \ Immette un backslash
'\'' ' Immette un apice singolo Il tipo char
'\"' " Immette un apice doppio
'\ooo' ooo Immette in carattere ASCII con
codice (ottale) ooo
'\xhh' hh Immette in carattere ASCII con
codice (esadecimale) hh 15

Input/output di char Stampa di caratteri

Esistono due insiemi di funzioni che permettono


di leggere e stampare variabili di tipo char: char ch ;
Le funzioni printf/scanf, usando lo
specificatore di formato "%c" printf("%c", ch) ;
Le funzioni putchar e getchar
In entrambi i casi sufficiente includere la
libreria <stdio.h>
possibile mescolare liberamente le due famiglie char ch ;
di funzioni
putchar(ch) ;
17 18
Lettura di caratteri Suggerimenti (1/2)

La funzione printf pi comoda quando


char ch ; occorre stampare altri caratteri insieme a quello
desiderato
scanf("%c", &ch) ; printf("La risposta e': %c\n", ch) ;
printf("Codice: %c%d\n", ch, num ) ;
La funzione putchar pi comoda quando
occorre stampare semplicemente il carattere
char ch ; for(ch='a'; ch<='z'; ch++)
putchar(ch) ;

ch = getchar() ;
19 20

Suggerimenti (2/2) Bufferizzazione dellinput-output

La funzione getchar generalmente pi Tutte le funzioni della libreria <stdio.h>


comoda in tutti i casi gestiscono linput-output in modo bufferizzato
printf("Vuoi continuare (s/n)? "); Per maggior efficienza, i caratteri non vengono
ch = getchar() ; trasferiti immediatamente dal programma al
terminale (o viceversa), ma solo a gruppi
quindi possibile che dopo una putchar, il
carattere non compaia immediatamente sullo
schermo
Analogamente, la getchar non restituisce il
carattere finch lutente non preme invio

21 22

Conseguenza pratica Conseguenza pratica

char ch,ch2 ; char ch,ch2 ;

printf("Dato: "); Dato: _ printf("Dato: "); Dato: _

ch = getchar() ; ch = getchar() ;

ch2 = getchar() ; ch2 = getchar() ;

Il programma stampa linvito ad inserire un dato 23


getchar blocca il programma in attesa del dato 24
Conseguenza pratica Conseguenza pratica

char ch,ch2 ; char ch,ch2 ;

printf("Dato: "); Dato: a_ printf("Dato: "); Dato: a


_
ch = getchar() ; ch = getchar() ;

ch2 = getchar() ; ch2 = getchar() ;

Lutente immette 'a', il programma non lo riceve 25


Lutente immette Invio, il programma prosegue 26

Conseguenza pratica Conseguenza pratica

char ch,ch2 ; char ch,ch2 ;

printf("Dato: "); Dato: a printf("Dato: "); Dato: a


_ _
ch = getchar() ; ch = getchar() ;

ch2 = getchar() ; ch2 = getchar() ;

Ora ch='a', il programma fa unaltra getchar() 27


Il programma non si blocca in attesa dellutente 28

Conseguenza pratica Consigli pratici

char ch,ch2 ; Ricordare che lutente deve sempre premere


Invio, anche se il programma richiede un singolo
Dato: a carattere
printf("Dato: ");
_ Ricordare che, se lutente inserisce pi di un
ch = getchar() ; carattere, questi verranno restituiti uno ad uno
nelle getchar successive
ch2 = getchar() ; Ricordare che lInvio viene letto come tutti gli
altri caratteri

Cera gi un carattere pronto: Invio! ch2='\n' 29 30


Soluzione proposta Soluzione proposta

char ch, temp ; char ch, temp ;

printf("Dato: "); printf("Dato: ");

ch = getchar() ; /* leggi il dato */ ch = getchar() ; /* leggi il dato */


/* forma pi compatta */
/* elimina eventuali caratteri successivi while
/* elimina eventuali ( getchar()!='\n'
caratteri successivi )
ed il \n che sicuramente ci sar */ /*niente*/
ed il \n che sicuramente ci sar; */
do { do {
temp = getchar() ; temp = getchar() ;
} while (temp != '\n') ; } while (temp != '\n') ;

31 32

Operazioni sui char

Le operazioni lecite sui char derivano


direttamente dalla combinazione tra
Le operazioni permesse sugli int
La disposizione dei caratteri nella tabella ASCII
Le convenzioni lessicali della nostra lingua scritta
Il tipo char

34

Conversione ASCII-Carattere Esempio (1/3)

Una variabile di tipo char allo stesso tempo


int i ;
Il valore numerico del codice ASCII del carattere char ch ; char-int.c

printf("%d", ch) ;
i = ch ; printf("Immetti codice ASCII (32-126): ");
ch = j ;
ch = 48 ; scanf("%d", &i) ;
Il simbolo corrispondente al carattere ASCII
printf("%c", ch) ; ch = i ;
putchar(ch) ;
ch = 'Z' ;
printf("Il carattere %c ha codice %d\n",
ch, i) ;
ch = '4' ;

35 36
Esempio (2/3) Esempio (3/3)

printf("Immetti un carattere: ") ; char-int.c char-int.c


ch = getchar() ;
Immetti un codice ASCII (32-126): 44
while(
while getchar() != '\n' ) Il carattere , ha codice ASCII 44
/**/ ;

i = ch ; Immetti un carattere: $
Il carattere $ ha codice ASCII 36
printf("Il carattere %c ha codice %d\n",
ch, i) ;

37 38

Scansione dellalfabeto Verifica se una lettera

possibile generare tutte le lettere dellalfabeto, Per sapere se un carattere alfabetico,


in ordine, grazie al fatto che nella tabella ASCII sufficiente verificare se cade nellintervallo delle
esse compaiono consecutive e ordinate lettere (maiuscole o minuscole)

if(
if ch>='A' && ch<='Z' )
char ch ; printf("%c lettera maiuscola\n", ch) ;

for(
for ch = 'A' ; ch <= 'Z' ; ch++ ) if(
if ch>='a' && ch<='z' )
putchar(ch) ; printf("%c lettera minuscola\n", ch) ;

putchar('\n') ; if(
if (ch>='A' && ch<='Z') ||
(ch>='a' && ch<='z') )
39 printf("%c lettera\n", ch) ; 40

Verifica se una cifra Valore di una cifra

Per sapere se un carattere numerico Conoscere il valore decimale di un carattere


('0'-'9'), sufficiente verificare se cade numerico ('0'-'9'), sufficiente calcolare la
nellintervallo delle cifre distanza dalla cifra '0'

if(
if ch>='0' && ch<='9' )
{
if(
if ch>='0' && ch<='9' )
printf("%c cifra numerica\n", ch) ;
printf("%c cifra numerica\n", ch) ;
val = ch - '0' ;
printf("Il suo valore e': %d", val ) ;
}

41 42
Da minuscolo a maiuscolo (1/2) Da minuscolo a maiuscolo (2/2)

I codici ASCII delle lettere maiuscole e delle Possiamo interpretare la conversione come una
minuscole differiscono solamente per una traslazione della quantit ( 'A'-'a' )
costante:
'A' = 65 ... 'Z' = 90
'a' = 97 ... 'z' = 122
Se ch una lettera minuscola if(
if ch>='a' && ch<='z' )
ch - 'a' la sua posizione nellalfabeto {
printf("%c lettera minuscola\n", ch) ;
( ch - 'a' ) + 'A' la corrispondente
ch2 = ch + ('A'-'a') ;
lettera maiuscola
printf(La maiuscola e': %c\n", ch2) ;
}

43 44

Confronto alfabetico

Se due caratteri sono entrambi maiuscoli (o


entrambi minuscoli) sufficiente confrontare i
rispettivi codici ASCII

if(
if ch < ch2 )
Il tipo char
printf("%c viene prima di %c", ch, ch2) ;
else
printf("%c viene prima di %c", ch2, ch) ;

45

Esercizio Quadrati di lettere Analisi

Si scriva un programma in linguaggio C che


stampi su video una serie di quadrati, composti Quanti quadrati vuoi stampare? 4
A
dalle successive lettere dellalfabeto, di
dimensioni sempre crescenti: BB
BB
Un quadrato 1x1 di lettere A
Un quadrato 2x2 di lettere B CCC
CCC
Un quadrato 3x3 di lettere C CCC
...eccetera
DDDD
DDDD
DDDD
DDDD

47 48
Soluzione (1/2) Soluzione (2/2)

for(
for i=0; i<N; i++ )
int i, N ; {
int riga, col ; quadrati.c /* stampa un quadrato quadrati.c

char ch ; di dimensione (i+1) */

printf("Quanti quadrati? ") ; ch = i + 'A' ;


scanf("%d", &N) ;
for(riga=0;
for riga<i+1; riga++)
while(N<1
while || N>26) {
{ for(col=0;
for col<i+1; col++)
printf("Deve essere tra 1 e 26\n"); putchar(ch);
printf("Quanti quadrati? ") ; putchar('\n') ;
scanf("%d", &N) ; }
} putchar('\n') ;
}
49 50
Vettori di caratteri

Il tipo stringa
Terminatore nullo
Input/output di stringhe

Caratteri e stringhe

Stringhe in C

Nel linguaggio C non supportato esplicitamente


alcun tipo di dato stringa
Le informazioni di tipo stringa vengono
memorizzate ed elaborate ricorrendo a semplici
vettori di caratteri
Vettori di caratteri
char saluto[10] ;

B u o n g i o r n o
4

Esempio Soluzione (1/3)

Si realizzi un programma in linguaggio C che


acquisisca da tastiera il nome dellutente (una saluti.c

stringa di max 20 caratteri), e stampi a video un const int MAX = 20 ;


saluto per lutente stesso char nome[MAX] ;
int N ;
char ch ;
int i ;
Come ti chiami? Fulvio
printf("Come ti chiami? ") ;
Buongiorno, Fulvio!
N = 0 ;

5 6
Soluzione (2/3) Soluzione (3/3)

saluti.c saluti.c

ch = getchar() ;
printf("Buongiorno, ") ;
while(
while ch != '\n' && N<MAX )
{ for(i=0;
for i<N; i++)
nome[N] = ch ; putchar( nome[i] ) ;
N++ ;
ch = getchar() ; printf("!\n") ;
}

7 8

Commenti (1/2) Commenti (2/2)

Qualsiasi operazione sulle stringhe si pu Alcune convenzioni ci possono aiutare


realizzare agendo opportunamente su vettori di Gestire in modo standard i vettori di caratteri usati
caratteri, gestiti con occupazione variabile per memorizzare stringhe
Cos facendo, per vi sono alcuni svantaggi Apprendere le tecniche solitamente utilizzate per
Per ogni vettore di caratteri, occorre definire compiere le operazioni pi frequenti
unopportuna variabile che ne indichi la lunghezza Molte funzioni di libreria seguono queste
Ogni operazione, anche elementare, richiede luso convenzioni
di cicli for/while Conoscere le funzioni di libreria ed utilizzarle per
accelerare la scrittura del programma

9 10

Lunghezza di una stringa

Vi sono due tecniche per determinare la


lunghezza di una stringa
1. utilizzare una variabile intera che memorizzi il
numero di caratteri validi

char nome[10] ; F u l v i o Z ! $ .
Vettori di caratteri int lungh_nome ;
6

12
Lunghezza di una stringa Carattere terminatore

Vi sono due tecniche per determinare la Il carattere terminatore deve avere le seguenti
lunghezza di una stringa caratteristiche
1. utilizzare una variabile intera che memorizzi il Fare parte della tabella dei codici ASCII
numero di caratteri validi Deve essere rappresentabile in un char

char nome[10] ; F u l v i o Z ! $ . Non comparire mai nelle stringhe utilizzate dal


int lungh_nome ; programma
6 Non deve confondersi con i caratteri normali
2. utilizzare un carattere speciale, con funzione di Inoltre il vettore di caratteri deve avere una
terminatore, dopo lultimo carattere valido posizione libera in pi, per memorizzare il
terminatore stesso
char nome[10] ; F u l v i o ! $ .
13 14

Terminatore standard in C Vantaggi

Per convenzione, in C si sceglie che tutte le Non necessaria unulteriore variabile intera per
stringhe siano rappresentate mediante un ciascuna stringa
carattere terminatore Linformazione sulla lunghezza della stringa
Il terminatore corrisponde al carattere di codice interna al vettore stesso
ASCII pari a zero Tutte le funzioni della libreria standard C
nome[6] = 0 ; rispettano questa convenzione
nome[6] = '\0' ; Si aspettano che la stringa sia terminata
Restituiscono sempre stringhe terminate

F u l v i o ! $ .
15 16

Svantaggi Esempio

Necessario 1 byte in pi Si realizzi un programma in linguaggio C che


Per una stringa di N caratteri, serve un vettore di acquisisca da tastiera il nome dellutente (una
N+1 elementi stringa di max 20 caratteri), e stampi a video un
Necessario ricordare di aggiungere sempre il saluto per lutente stesso
terminatore
Impossibile rappresentare stringhe contenenti il
Come ti chiami? Fulvio
carattere ASCII 0
Buongiorno, Fulvio!

17 18
Soluzione (1/3) Soluzione (2/3)

i = 0 ;
saluti0.c saluti0.c

const int MAX = 20 ; ch = getchar() ;


char nome[MAX+1] ;
char ch ; while(
while ch != '\n' && i<MAX )
int i ; {
nome[i] = ch ;
printf("Come ti chiami? ") ; i++ ;
ch = getchar() ;
i = 0 ; }
/* aggiunge terminatore nullo */
nome[i] = '\0' ;

19 20

Soluzione (3/3)

saluti0.c

printf("Buongiorno, ") ;

for(i=0;
for nome[i]!='\0'; i++)
putchar( nome[i] ) ; Vettori di caratteri
printf("!\n") ;

21

I/O di stringhe Lettura di stringhe con scanf

Diamo per scontato di utilizzare la convenzione Utilizzare la funzione scanf con lo specificatore
del terminatore nullo di formato "%s"
Si possono utilizzare La variabile da leggere deve essere il nome di un
Funzioni di lettura e scrittura carattere per vettore di caratteri
carattere Non utilizzare le parentesi quadre
Come nellesercizio precedente Non utilizzare la &
Funzioni di lettura e scrittura di stringhe intere Legge ci che viene immesso da tastiera, fino al
scanf e printf primo spazio o fine linea (esclusi)
gets e puts
Non adatta a leggere nomi composti
(es. "Pier Paolo")

23 24
Esempio Lettura di stringhe con gets

La funzione gets pensata appositamente per


acquisire una stringa
Accetta un parametro, che corrisponde al nome
const int MAX = 20 ; di un vettore di caratteri
char nome[MAX+1] ; Non utilizzare le parentesi quadre
printf("Come ti chiami? ") ; Legge ci che viene immesso da tastiera, fino al
fine linea (escluso), e compresi eventuali spazi
scanf("%s", nome) ; Possibile leggere nomi composti
(es. "Pier Paolo")

25 26

Esempio Scrittura di stringhe con printf

Utilizzare la funzione printf con lo specificatore


di formato "%s"
La variabile da stampare deve essere il nome di
const int MAX = 20 ; un vettore di caratteri
char nome[MAX+1] ; Non utilizzare le parentesi quadre
printf("Come ti chiami? ") ; possibile combinare la stringa con altre variabili
nella stessa istruzione
gets(nome) ;

27 28

Esempio Scrittura di stringhe con puts

La funzione puts pensata appositamente per


stampare una stringa
La variabile da stampare deve essere il nome di
printf("Buongiorno, ") ;
printf("%s", nome) ;
un vettore di caratteri
printf("!\n") ; Non utilizzare le parentesi quadre
Va a capo automaticamente
Non possibile stampare altre informazioni sulla
printf("Buongiorno, %s!\n", nome) ; stessa riga

29 30
Esempio Conclusione

Utilizzare sempre la convenzione del terminatore


nullo
Ricordare di allocare un elemento in pi nei
vettori di caratteri
printf("Buongiorno, ") ;
Utilizzare quando possibile le funzioni di libreria
puts(nome) ;
predefinite
/* No!! printf("!\n") ; */ In lettura, prediligere gets
In scrittura
printf indicata per messaggi composti
puts pi semplice se si ha un dato per riga

31 32
Operazioni elementari sulle stringhe

Lunghezza
Copia di stringhe
Concatenazione di stringhe
Confronto di stringhe
Ricerca di sotto-stringhe
Caratteri e stringhe Ricerca di parole

Lunghezza di una stringa

La lunghezza di una stringa si pu determinare


ricercando la posizione del terminatore nullo

char s[MAX+1] ;
int lun ;
Operazioni elementari sulle stringhe

s S a l v e 3 r W t
0 1 2 3 4 5

Calcolo della lunghezza La funzione strlen

Nella libreria standard C disponibile la funzione


const int MAX = 20 ; strlen, che calcola la lunghezza della stringa
char s[MAX+1] ; passata come parametro
int lun ;
int i ;
Necessario includere <string.h>

... /* lettura stringa */ const int MAX = 20 ;


char s[MAX+1] ;
for(
for i=0 ; s[i] != 0 ; i++ ) int lun ;
/* Niente */ ;
... /* lettura stringa */
lun = i ;
lun = strlen(s) ;
5 6
Copia di stringhe

Loperazione di copia prevede di ricopiare il


contenuto di una prima stringa sorgente, in una
seconda stringa destinazione

char src[MAXS+1] ;
char dst[MAXD+1] ;
Operazioni elementari sulle stringhe

src S a l v e 3 r W t

dst 2 % q " t o $ n o
8

Risultato della copia Copia

src S a l v e 3 r W t const int MAXS = 20, MAXD = 30 ;


char src[MAXS+1] ;
char dst[MAXD+1] ;
int i ;
dst 2 % q " t o $ n o
Copia src in dst ... /* lettura stringa src */

for(
for i=0 ; src[i] != 0 ; i++ )
dst[i] = src[i] ; /* copia */

dst S a l v e o $ n o dst[i] = 0 ; /* aggiunge terminatore */

9 10

La funzione strcpy Avvertenze

Nella libreria standard C, includendo Nella stringa destinazione vi deve essere un


<string.h>, disponibile la funzione strcpy, numero sufficiente di locazioni libere
che effettua la copia di stringhe MAXD+1 >= strlen(src)+1
Primo parametro: stringa destinazione Il contenuto precedente della stringa
Secondo parametro: stringa sorgente destinazione viene perso
La stringa sorgente non viene modificata
const int MAXS = 20, MAXD = 30 ;
char src[MAXS+1] ; Il terminatore nullo
char dst[MAXD+1] ; Deve essere aggiunto in coda a dst
La strcpy pensa gi autonomamente a farlo
... /* lettura stringa src */

strcpy(dst, src) ; 11 12
Errore frequente

Per effettuare una copia di stringhe non si pu


assolutamente utilizzare loperatore =
Necessario usare strcpy

dst = src ; strcpy(dst, src);


Operazioni elementari sulle stringhe

dst[] = src[] ;

dst[MAXD] = src[MAXC] ;
13

Concatenazione di stringhe Semplificazione

Loperazione di concatenazione corrisponde a Per maggior semplicit, in C loperazione di


creare una nuova stringa composta dai caratteri concatenazione scrive il risultato nello stesso
di una prima stringa, seguiti dai caratteri di una vettore della prima stringa
seconda stringa Il valore precedente della prima stringa viene cos
S a l v e 3 r W t perso
sa
Per memorizzare altrove il risultato, o per non
perdere la prima stringa, possibile ricorrere a
sb m o n d o o $ n o stringhe temporanee ed alla funzione strcpy
Concatenazione di sa con sb

S a l v e m o n d o w 1 Q r
15 16

Esempio Algoritmo di concatenazione

Trova la fine della prima stringa


sa S a l v e w z 3 w 7 w 1 Q r

sb m o n d o h ! L . 2 x y E P

Concatenazione di sa con sb

sa S a l v e m o n d o w 1 Q r sa S a l v e w z 3 w 7 w 1 Q r

sb m o n d o h ! L . 2 x y E P
17 18
Algoritmo di concatenazione Algoritmo di concatenazione

Trova la fine della prima stringa Trova la fine della prima stringa
Copia la seconda stringa nel vettore della prima, Copia la seconda stringa nel vettore della prima,
a partire della posizione del terminatore nullo a partire della posizione del terminatore nullo
(sovrascrivendolo) (sovrascrivendolo)
Termina la copia non appena trovato il
terminatore della seconda stringa

sa S a l v e w z 3 w 7 w 1 Q r sa S a l v e m o n d o w 1 Q r

sb m o n d o h ! L . 2 x y E P sb m o n d o h ! L . 2 x y E P

19 20

Concatenazione La funzione strcat

const int MAX = 20 ; Nella libreria standard C, includendo


char sa[MAX] ; <string.h>, disponibile la funzione strcat,
char sb[MAX] ;
int la ; che effettua la concatenazione di stringhe
int i ; Primo parametro: prima stringa (destinazione)
Secondo parametro: seconda stringa
... /* lettura stringhe */

la = strlen(sa) ; const int MAX = 20 ;


char sa[MAX] ;
for(
for i=0 ; sb[i] != 0 ; i++ ) char sb[MAX] ;
sa[la+i] = sb[i] ; /* copia */
... /* lettura stringhe */
sa[la+i] = 0 ; /* terminatore */
21
strcat(sa, sb) ; 22

Avvertenze (1/2) Avvertenze (2/2)

Nella prima stringa vi deve essere un numero Per concatenare 3 o pi stringhe, occorre farlo
sufficiente di locazioni libere due a due:
MAX+1 >= strlen(sa)+strlen(sb)+1 strcat(sa, sb);
Il contenuto precedente della prima stringa strcat(sa, sc);
viene perso possibile concatenare anche stringhe costanti
La seconda stringa non viene modificata strcat(sa, "!");
Il terminatore nullo
Deve essere aggiunto in coda alla prima stringa
La strcat pensa gi autonomamente a farlo

23 24
Confronto di stringhe

Il confronto di due stringhe (es.: sa e sb), mira


a determinare se:
Le due stringhe sono uguali
hanno uguale lunghezza e sono composte dagli
stessi caratteri nello stesso ordine
Le due stringhe sono diverse
Operazioni elementari sulle stringhe La stringa sa precede la stringa sb
secondo lordine lessicografico imposto dal codice
ASCII
parzialmente compatibile con lordine alfabetico
La stringa sa segue la stringa sb

26

Confronto di uguaglianza Confronto di uguaglianza

const int MAX = 20 ;


Ogni carattere di sa deve essere uguale al char sa[MAX] ;
carattere corrispondente di sb char sb[MAX] ;
Il terminatore nullo deve essere nella stessa int uguali ;
int i ;
posizione ...
I caratteri successivi al terminatore vanno
ignorati uguali = 1 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0 ; i++ )
{
sa S a l v e o 4 d 1 w 1 Q r if(sa[i]!=sb[i])
if
uguali = 0 ;
}
sb S a l v e h ! L . 2 x y E P if(sa[i]!=0
if || sb[i]!=0)
uguali = 0 ;
27 28

Confronto di uguaglianza Confronto di uguaglianza

const int MAX = 20 ; const int MAX = 20 ;


char sa[MAX] ; char sa[MAX] ;
char sb[MAX]Flag:
; ricerca di universalit char sb[MAX] ; Cicla fino al terminatore di
int uguali ; della condizione int uguali ; sa o di sb
int i ; sa[i]==sb[i] int i ; (il primo che si incontra)
... ...

uguali = 1 ; uguali = 1 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0 ; i++ ) for(
for i=0 ; sa[i]!=0 && sb[i]!=0 ; i++ )
{ {
if(sa[i]!=sb[i])
if if(sa[i]!=sb[i])
if
uguali = 0 ; uguali = 0 ;
} }
if(sa[i]!=0
if || sb[i]!=0) if(sa[i]!=0
if || sb[i]!=0)
uguali = 0 ; uguali = 0 ;
29 30
Confronto di uguaglianza Confronto di uguaglianza

const int MAX = 20 ; const int MAX = 20 ;


char sa[MAX] ; char sa[MAX] ;
char sb[MAX] ; char sb[MAX] ;
int uguali ; int uguali ;
int i ; int i ;
... ...
Verifica che tutti i caratteri In questo punto sicuramente
uguali = 1 ; incontrati siano uguali. uguali = 1 ; una delle due stringhe
for(
for i=0 ; sa[i]!=0 &&Se sb[i]!=0
no, poni a 0 il;flag
i++ )
uguali. for(
for i=0 ; sa[i]!=0 && sb[i]!=0 ; i++ )
arrivata al terminatore.
{ { Se non lo anche laltra,
if(sa[i]!=sb[i])
if if(sa[i]!=sb[i])
if allora non sono uguali!
uguali = 0 ; uguali = 0 ;
} }
if(sa[i]!=0
if || sb[i]!=0) if(sa[i]!=0
if || sb[i]!=0)
uguali = 0 ; uguali = 0 ;
31 32

Confronto di ordine Confronto di ordine (1/2)

const int MAX = 20 ;


Verifichiamo se sa minore di sb. Partiamo char sa[MAX] ;
con i=0 char sb[MAX] ;
Se sa[i]<sb[i], allora sa minore int minore ;
int i ;
Se sa[i]>sb[i], allora sa non minore ...
Se sa[i]=sb[i], allora bisogna controllare i minore = 0 ;
caratteri successivi (i++) for(
for i=0 ; sa[i]!=0 && sb[i]!=0
&& minore==0; i++ )
Il terminatore nullo conta come minore di tutti {
if(sa[i]<sb[i])
if
sa S a l v e o 4 d 1 w 1 Q r minore = 1 ;
if(sa[i]>sb[i])
if
minore = -1 ;
sb S a l u t e ! L . 2 x y E P }
33 34

Confronto di ordine (2/2) Commenti

minore = 0 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0
Ricerca
&& minore==0; i++di esistenza
) della
{ condizione sa[i]<sb[i].
if(sa[i]<sb[i])
if
if(minore==0
if && sa[i]==0 && sb[i]!=0)
minore = 1 ;
minore=1 ;
if(sa[i]>sb[i])
if
minore = -1 ;
if(minore==1)
if
}
printf("%s e' minore di %s\n",
sa, sb ) ;
if(minore==0
if && sa[i]==0 && sb[i]!=0)
minore=1 ;

if(minore==1)
if
...
35 36
Commenti Commenti

minore = 0 ; minore = 0 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0 for(
for i=0 ; sa[i]!=0 && sb[i]!=0
Sicuramente sa minore di sb
&& minore==0; i++ ) && minore==0;Flag:i++ )
minore = 1
{ {
if(sa[i]<sb[i])
if if(sa[i]<sb[i])
if
minore = 1 ; fino al primo terminatore
Cicla minore = 1 ;
if(sa[i]>sb[i])
if nullo, oppure fino a che non si if(sa[i]>sb[i])
if
minore = -1 scopre
; chi minore. minore = -1 ;
} In altre parole, continua a }
ciclare solo finch le stringhe Sicuramente sa non minore
if(minore==0
if && sa[i]==0 && sb[i]!=0)
sembrano uguali. Se flag
if(minore==0
if di sb
&& sa[i]==0 && sb[i]!=0)
minore=1 ; minore==0
minore=1 ; Flag: minore = -1
continua a ciclare
if(minore==1)
if if(minore==1)
if
... ...
37 38

Commenti La funzione strcmp

minore = 0 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0 Nella libreria standard C, includendo
&& minore==0; i++ ) <string.h>, disponibile la funzione strcmp,
{ che effettua il confronto di stringhe
if(sa[i]<sb[i])
if Primo parametro: prima stringa
minore = 1 ; Se finora erano uguali, ma sa
if(sa[i]>sb[i])
if Secondo parametro: seconda stringa
pi corta di sb, allora sa
minore = -1 ; minore Valore restituito:
} <0 se la prima stringa minore della seconda
==0 se le stringhe sono uguali
if(minore==0
if && sa[i]==0 && sb[i]!=0)
minore=1 ; >0 se la prima stringa maggiore della seconda

if(minore==1)
if
...
39 40

Confronti vari Suggerimento

const int MAX = 20 ; Per ricordare il significato del valore calcolato da


char sa[MAX] ; strcmp, immaginare che la funzione faccia una
char sb[MAX] ;
int ris ; sottrazione tra le due stringhe
sa sb
... Negativo: sa minore
Positivo: sa maggiore
ris = strcmp(sa, sb) ;
Nullo: uguali
if(ris<0)
if const int MAX = 20 ;
printf("%s minore di %s\n", sa, sb); char sa[MAX] ;
if(ris==0)
if char sb[MAX] ;
printf("%s uguale a %s\n", sa, sb); int ris ;
if(ris>0)
if ...
printf("%s maggiore di %s\n", sa, sb);
41 ris = strcmp(sa, sb) ; 42
Ordinamento delle stringhe Conseguenze

La funzione strcmp lavora confrontando tra loro Ogni lettera maiuscola precede ogni lettera
i codici ASCII dei caratteri minuscola
Il criterio di ordinamento quindi dato dalla Ciao precede ciao
posizione dei caratteri nella tabella ASCII Zulu precede apache
Gli spazi contano, e precedono le lettere
Nullo Spazio Cifre numeriche Lettere maiuscole Lettere minuscole Qui Quo Qua precede QuiQuoQua
 0 9 A Z a z I simboli di punteggiatura contano, ma non vi
una regola intuitiva
Caratteri di Punteggiatura
controllo
Punteggiatura Punteggiatura Punteggiatura Lordinamento che si ottiene lievemente diverso
da quello standard alfabetico
43 44

Ricerca in una stringa

possibile concepire diversi tipi di ricerche da


compiersi allinterno di una stringa:
Determinare se un determinato carattere compare
allinterno di una stringa data
Determinare se una determinata stringa compare
integralmente allinterno di unaltra stringa data, in
Operazioni elementari sulle stringhe una posizione arbitraria

46

Ricerca di un carattere (1/2) Ricerca di un carattere (2/2)

Detti: const int MAX = 20 ;


s una stringa arbitraria char s[MAX] ;
char ch ;
ch un carattere qualsiasi int trovato ;
Determinare se la stringa s contiene (una o pi int i ;
volte) il carattere ch al suo interno, in qualsiasi
...
posizione
trovato = 0 ;
for(
for i=0 ; s[i]!=0 && trovato==0; i++ )
s S a l v e o 4 d 1 a w 1 Q r {
if(
if s[i]==ch )
trovato = 1 ;
}
ch a
47 48
La funzione strchr (1/2) La funzione strchr (2/2)

Nella libreria standard C, includendo


<string.h>, disponibile la funzione strchr,
che effettua la ricerca di un carattere const int MAX = 20 ;
Primo parametro: stringa in cui cercare char s[MAX] ;
Secondo parametro: carattere da cercare char ch ;
Valore restituito: ...
!=NULL se il carattere c
==NULL se il carattere non c if(strchr(s,
if ch)!=NULL)
printf("%s contiene %c\n", s, ch) ;

49 50

Ricerca di una sotto-stringa Esempio

Detti: s S a l v e a t u t t i r
s una stringa arbitraria
r una stringa da ricercare t u t
Determinare se la stringa s contiene (una o pi
volte) la stringa r al suo interno, in qualsiasi
posizione

s S a l v e a t u t t i r

r t u t z 3 r t u t z 3
51 52

Esempio Esempio

s S a l v e a t u t t i r s S a l v e a t u t t i r

t u t t u t t u t t u t

t u t t u t t u t

t u t t u t

t u t t u t

r t u t z 3 53
r t u t z 3 54
Esempio Algoritmo di ricerca

s S a l v e a t u t t i r lr = strlen(r) ; ls = strlen(s)
trovato = 0
t u t t u t t u t Per ogni posizione possibile di r allinterno di s:
pos = 0...ls-lr (compresi)
t u t t u t t u t

t u t t u t t u t

t u t t u t s S a l v e a t u t t i r

r t u t z 3 55
pos r t u t lr ls 56

Algoritmo di ricerca Algoritmo di ricerca

lr = strlen(r) ; ls = strlen(s) lr = strlen(r) ; ls diversi = 0 ;


= strlen(s)
for(i=0;
for i<lr; i++)
trovato = 0 trovato = 0 if(r[i]!=s[pos+i])
if
diversi = 1 ;
Per ogni posizione possibile di r allinterno di s: Per ogni posizione possibile di r allinterno di s:
pos = 0...ls-lr (compresi) pos = 0...ls-lr (compresi)
Controlla se i caratteri di r, tra 0 e lr-1, Controlla se i caratteri di r, tra 0 e lr-1,
coincidono con i caratteri di s, tra pos e coincidono con i caratteri di s,tra pos e
pos+lr-1 pos+lr-1
Se s, trovato = 1 Se s, trovato = 1

s S a l v e a t u t t i r s S a l v e a t u t t i r

pos r t u t lr ls 57
pos r t u t lr ls 58

Algoritmo di ricerca Ricerca di una sotto-stringa (1/2)

lr = strlen(r) ; ls = strlen(s)
trovato = 0 const int MAX = 20 ; substr.c

char s[MAX] ;
Per ogni posizione possibile di r allinterno di s: char r[MAX] ;
pos = 0...ls-lr if(diversi==0)
if int lr, ls, pos ;
Controlla se i caratteri di trovato=1 ;
r, tra 0 e lr-1, int i ;
coincidono con i caratteri di s,tra pos e int trovato, diversi ;
pos+lr-1
...
Se s, trovato = 1
ls = strlen(s);
s S a l v e a t u t t i r lr = strlen(r);

pos r t u t lr ls 59 60
Ricerca di una sotto-stringa (2/2) La funzione strstr (1/2)

trovato = 0 ;
for(pos=0;
for pos<=ls-lr; pos++) Nella libreria standard C, includendo
{ substr.c <string.h>, disponibile la funzione strstr,
/* confronta r[0...lr-1] con s[pos...pos+lr-1] */ che effettua la ricerca di una sottostringa
diversi = 0 ; Primo parametro: stringa in cui cercare
for(i=0;
for i<lr; i++)
if(r[i]!=s[pos+i])
if Secondo parametro: sotto-stringa da cercare
diversi = 1 ; Valore restituito:
!=NULL se la sotto-stringa c
if(diversi==0)
if ==NULL se la sotto-stringa non c
trovato=1 ;
}

if(trovato==1)
if
printf("Trovato!\n");
61 62

La funzione strstr (2/2)

const int MAX = 20 ;


char s[MAX] ;
char r[MAX] ;

... Operazioni elementari sulle stringhe


if(strstr(s,
if r)!=NULL)
printf("Trovato!\n");

63

Ricerca di parole Definizioni (1/2)

Talvolta non interessa trovare una qualsiasi Lettera: carattere ASCII facente parte
sotto-stringa, ma solamente verificare se una dellalfabeto maiuscolo ('A'...'Z') o minuscolo
parola completa presente in una stringa ('a'...'z')
Parola: insieme consecutivo di lettere, separato
da altre parole mediante spazi, numeri o simboli
di punteggiatura
s1 C i a o n o n n o t 2 " r

s2 O g g i n o n c ' e ' 4

r n o n z 3
65 66
Definizioni (2/2) Algoritmo di ricerca

Inizio di parola: lettera, prima della quale non Per ogni possibile posizione pos di r allinterno di
vi unaltra lettera s
Non vi un altro carattere (inizio stringa) Se il carattere in quella posizione, s[pos], un
Vi un altro carattere, ma non una lettera inizio di parola
Controlla se i caratteri di r, tra 0 e lr-1, coincidono
Fine di parola: lettera, dopo la quale non vi
con i caratteri di s,tra pos e pos+lr-1
unaltra lettera
Controlla se s[pos+lr-1] una fine di parola
Non vi un altro carattere (fine stringa) Se entrambi i controlli sono ok, allora trovato=1
Vi un altro carattere, ma non una lettera

67 68

Algoritmo di ricerca Algoritmo di ricerca

Per ogni possibile posizione pos di r allinterno di Per ogni possibile posizione pos di r allinterno di
s s
Se il carattere in quella posizione, s[pos], un Se il carattere in quella posizione, s[pos], un
inizio di parola inizio di parola
Controlla se i caratteri di r, tra 0 e lr-1, coincidono Controlla se i caratteri di r, tra 0 e lr-1, coincidono
con i caratteri di s,tra pos e pos+lr-1 con i caratteri di s,tra pos e pos+lr-1
Controlla se s[pos+lr-1] una fine di parola Controlla se s[pos+lr-1] una fine di parola
if(
if pos
Se entrambi i controlli == ok,
sono 0 ||
allora trovato=1 if(
if pos
Se entrambi i controlli == ok,
sono 0 ||
allora trovato=1
s[pos-1] non una lettera ) s[pos-1] non una lettera )

if(
if pos == 0 ||
!( (s[pos-1]>='a' && s[pos-1]<='z') ||
(s[pos-1]>='A' && s[pos-1]<='Z') )
)
69 70

Algoritmo di ricerca Algoritmo di ricerca

Per ogni possibile posizione pos di r allinterno di Per ogni possibile posizione pos di r allinterno di
s if(
if pos == ls-lr || s if(
if pos == ls-lr ||
Se il carattere in quellas[pos+lr] s[pos],
posizione,non un)
una lettera Se il carattere in quellas[pos+lr] s[pos],
posizione,non un)
una lettera
inizio di parola inizio di parola
Controlla se i caratteri di r, tra 0 e lr-1, coincidono if(
if pos == ls-lr se
Controlla || i caratteri di r, tra 0 e lr-1, coincidono
!( (s[pos+lr]>='a' && s[pos+lr]<='z') ||
con i caratteri di s,tra pos e pos+lr-1 con i caratteri di s,tra pos e pos+lr-1
(s[pos+lr]>='A' && s[pos+lr]<='Z') )
Controlla se s[pos+lr-1] una fine di parola ) Controlla se s[pos+lr-1] una fine di parola
Se entrambi i controlli sono ok, allora trovato=1 Se entrambi i controlli sono ok, allora trovato=1

71 72
Ricerca di una parola (1/2) Ricerca di una parola (2/2)

trovato = 0 ;
if(
if diversi==0 &&
for(pos=0;
for pos<=ls-lr; pos++) parola.c parola.c
( pos == ls-lr ||
{
!( (s[pos+lr]>='a' &&
if(
if pos==0 ||
s[pos+lr]<='z') ||
!( (s[pos-1]>='a' &&
(s[pos+lr]>='A' &&
s[pos-1]<='z') ||
s[pos+lr]<='Z') )
(s[pos-1]>='A' &&
) )
s[pos-1]<='Z') ) )
{
{
trovato=1 ;
diversi = 0 ;
}
for(i=0;
for i<lr; i++)
}
if(r[i]!=s[pos+i])
if
}
diversi = 1 ;
73 74

La funzione strparola

Nella libreria standard C non esiste alcuna


funzione che svolga automaticamente la ricerca
di una parola intera!!!
Occorre identificare, ogni volta, se il compito da
svolgere riconducibile ad una o pi funzioni di
libreria
Eventualmente si combinano tra loro pi funzioni
di libreria diverse
In alcuni casi occorre per ricorrere allanalisi
carattere per carattere

75
Funzioni di libreria

Introduzione
Lunghezza di stringhe
Classificazione di caratteri
Trasformazione di caratteri
Copia e concatenazione
Caratteri e stringhe Confronto di stringhe
Ricerca in stringhe
Conversione numero-stringa

Librerie sulle stringhe

La libreria standard C dispone di molte funzioni


predisposte per lavorare su caratteri e stringhe
Tali funzioni si trovano prevalentemente in due
librerie:
<ctype.h> funzioni operanti su caratteri
Funzioni di libreria <string.h> funzioni operanti su stringhe
Tutte le funzioni di libreria accettano e generano
stringhe correttamente terminate

Suggerimenti Rappresentazione

Quando possibile, utilizzare sempre le funzioni di Nome funzione strlen


libreria Libreria #include <string.h>
Sono pi veloci Parametri in s : stringa
Sono maggiormente collaudate ingresso
In ogni caso, ricordare che sempre possibile Valore restituito int : la lunghezza della stringa
effettuare le operazioni direttamente: Descrizione Calcola la lunghezza della stringa s
Sui caratteri, ricorrendo alla codifica ASCII
Sulle stringhe, ricorrendo alla rappresentazione
come vettori di caratteri
Esempio lun = strlen(s) ;

5 6
Convenzioni

Assumiamo che nel seguito di questa lezione


siano valide le seguenti definizioni

const int MAX = 20 ;


char s[MAX] ;
char s1[MAX] ; Funzioni di libreria
char s2[MAX] ;
char r[MAX] ;
int lun ;
int n ;
char ch ;
float x ;
7

Lunghezza di stringhe strlen

Definite in strlen Nome funzione strlen


<string.h> Libreria #include <string.h>
Determina la lunghezza Parametri in s : stringa
di una stringa data ingresso
Valore restituito int : la lunghezza della stringa
Descrizione Calcola la lunghezza della stringa s

Esempio lun = strlen(s) ;

9 10

Classificazione di caratteri

Definite in <ctype.h> isalpha


Analizzano un singolo isupper
carattere, islower
identificandone la isdigit
tipologia isalnum
Lettera isxdigit
Funzioni di libreria Maiuscola ispunct
Minuscola isgraph
Cifra isprint
Punteggiatura isspace
iscntrl

12
isalpha isupper

Nome funzione isalpha Nome funzione isupper


Libreria #include <ctype.h> Libreria #include <ctype.h>
Parametri in ch : carattere Parametri in ch : carattere
ingresso ingresso
Valore restituito Vero/falso Valore restituito Vero/falso
Descrizione Ritorna vero se il carattere ch una Descrizione Ritorna vero se il carattere ch una
lettera maiuscola o minuscola (A...Z, lettera maiuscola (A...Z), falso
a...z), falso altrimenti altrimenti

Esempio if(isalpha(ch))
if Esempio if(isupper(ch))
if
{ ... } { ... }
13 14

islower isdigit

Nome funzione islower Nome funzione isdigit


Libreria #include <ctype.h> Libreria #include <ctype.h>
Parametri in ch : carattere Parametri in ch : carattere
ingresso ingresso
Valore restituito Vero/falso Valore restituito Vero/falso
Descrizione Ritorna vero se il carattere ch una Descrizione Ritorna vero se il carattere ch una
lettera minuscola (a...z), falso cifra numerica (0...9), falso
altrimenti altrimenti

Esempio if(islower(ch))
if Esempio if(isdigit(ch))
if
{ ... } { ... }
15 16

isalnum isxdigit

Nome funzione isalnum Nome funzione isxdigit


Libreria #include <ctype.h> Libreria #include <ctype.h>
Parametri in ch : carattere Parametri in ch : carattere
ingresso ingresso
Valore restituito Vero/falso Valore restituito Vero/falso
Descrizione Ritorna vero se il carattere ch una Descrizione Ritorna vero se il carattere ch una
lettera oppure una cifra numerica, una cifra numerica oppure una lettera
falso altrimenti. valida in base 16 (a...f, A...F), falso
Equivalente a altrimenti.
isalpha(ch)||isdigit(ch) Esempio if(isxdigit(ch))
if
Esempio if(isalnum(ch))
if { ... }
{ ... } 17 18
ispunct isgraph

Nome funzione ispunct Nome funzione isgraph


Libreria #include <ctype.h> Libreria #include <ctype.h>
Parametri in ch : carattere Parametri in ch : carattere
ingresso ingresso
Valore restituito Vero/falso Valore restituito Vero/falso
Descrizione Ritorna vero se il carattere ch un Descrizione Ritorna vero se il carattere ch un
simbolo di punteggiatura qualsiasi simbolo visibile (lettera,
(!"#$%&'()*+,-./:;<=>?@ cifra, punteggiatura), falso
[\]^_`{|}~), falso altrimenti. altrimenti.
Esempio if(ispunct(ch))
if Esempio if(isgraph(ch))
if
{ ... } { ... }
19 20

isprint isspace

Nome funzione isprint Nome funzione isspace


Libreria #include <ctype.h> Libreria #include <ctype.h>
Parametri in ch : carattere Parametri in ch : carattere
ingresso ingresso
Valore restituito Vero/falso Valore restituito Vero/falso
Descrizione Ritorna vero se il carattere ch un Descrizione Ritorna vero se il carattere ch
qualsiasi simbolo visibile oppure lo invisibile (spazio, tab, a capo), falso
spazio, falso altrimenti. altrimenti.

Esempio if(isprint(ch))
if Esempio if(isspace(ch))
if
{ ... } { ... }
21 22

iscntrl Vista dinsieme

Nome funzione iscntrl


Libreria #include <ctype.h>
A...F G...Z
Parametri in ch : carattere isupper !"#$%&'(
ingresso )*+,-./:
a...f g...z ;<=>?@[\
Valore restituito Vero/falso islower
]^_`{|}~
isalpha
Descrizione Ritorna vero se ch un carattere di ispunct

controllo (ASCII 0...31, 127), falso 0...9


isdigit
altrimenti. isxdigit
isalnum isgraph

Spazio isprint
Esempio if(iscntrl(ch))
if
{ ... } Caratteri di Tab
controllo Newline isspace
23 24
iscntrl
Trasformazione di caratteri

Definite in <ctype.h> toupper


Convertono tra lettere tolower
maiuscole e lettere
minuscole

Funzioni di libreria

26

toupper tolower

Nome funzione toupper Nome funzione tolower


Libreria #include <ctype.h> Libreria #include <ctype.h>
Parametri in ch : carattere Parametri in ch : carattere
ingresso ingresso
Valore restituito char : carattere maiuscolo Valore restituito char : carattere maiuscolo
Descrizione Se ch una lettera minuscola, ritorna Descrizione Se ch una lettera minuscola, ritorna
lequivalente carattere maiuscolo, se lequivalente carattere maiuscolo, se
no ritorna ch stesso no ritorna ch stesso

Esempio for(i=0;
for s[i]!=0; i++) Esempio for(i=0;
for s[i]!=0; i++)
s[i] = toupper(s[i]) ; s[i] = tolower(s[i]) ;
27 28

Copia e concatenazione

Definite in strcpy
<string.h> strncpy
Trasferiscono il strcat
contenuto di una strncat
stringa in unaltra
Sostituendolo
Funzioni di libreria
Accodandolo

30
strcpy strncpy

Nome funzione strcpy Nome funzione strncpy


Libreria #include <string.h> Libreria #include <string.h>
Parametri in dst : stringa Parametri in dst : stringa
ingresso src : stringa ingresso src : stringa
Valore restituito nessuno utile n : numero max caratteri
Descrizione Copia il contenuto della stringa src Valore restituito nessuno utile
allinterno della stringa dst (che deve Descrizione Copia il contenuto della stringa src
avere lunghezza sufficiente). (massimo n caratteri) allinterno della
stringa dst.
Esempio strcpy(s1, s2) ;
Esempio strncpy(s1, s2, 20) ;
strcpy(s, "") ;
strncpy(s1, s2, MAX) ;
strcpy(s1, "ciao") ; 31 32

strcat strncat

Nome funzione strcat Nome funzione strncat


Libreria #include <string.h> Libreria #include <string.h>
Parametri in dst : stringa Parametri in dst : stringa
ingresso src : stringa ingresso src : stringa
Valore restituito nessuno utile n : numero max caratteri
Descrizione Accoda il contenuto della stringa src Valore restituito nessuno utile
alla fine della stringa dst (che deve Descrizione Accoda il contenuto della stringa src
avere lunghezza sufficiente). (massimo n caratteri) alla fine della
stringa dst.
Esempio strcat(s1, s2) ;
strcat(s1, " ") ; Esempio strncat(s1, s2) ;
33 34

Confronto di stringhe

Definite in strcmp
<string.h> strncmp
Confrontano due
stringhe sulla base
dellordine
lessicografico imposto
Funzioni di libreria
dalla tabella dei codici
ASCII

36
strcmp strncmp

Nome funzione strcmp Nome funzione strncmp


Libreria #include <string.h> Libreria #include <string.h>
Parametri in s1 : stringa Parametri in s1 : stringa
ingresso s2 : stringa ingresso s2 : stringa
Valore restituito int : risultato confronto n : numero max caratteri
Descrizione Risultato <0 se s1 precede s2 Valore restituito int : risultato confronto
Risultato ==0 se s1 uguale a s2 Descrizione Simile a strcmp, ma confronta solo i
Risultato >0 se s1 segue s2 primi n caratteri, ignorando i
successivi.
Esempio if(strcmp(s,
if r)==0) {...}
while(strcmp(r,"fine")!=0)
while Esempio if(strncmp(r,
if "buon", 4)==0)
{...} 37 (buongiorno, buonasera, buonanotte)38

Ricerca

Definite in strchr
<string.h> strstr
Ricercano allinterno strspn
di una stringa data strcspn
Se compare un
carattere
Funzioni di libreria
Se compare una
sotto-stringa
Se compare una
sequenza qualsiasi
composta di
caratteri dati
40

strchr strstr

Nome funzione strchr Nome funzione strstr


Libreria #include <string.h> Libreria #include <string.h>
Parametri in s : stringa Parametri in s : stringa
ingresso ch : carattere ingresso r : stringa
Valore restituito ==NULL oppure !=NULL Valore restituito ==NULL oppure !=NULL
Descrizione Risultato !=NULL se il carattere ch Descrizione Risultato !=NULL se la sotto-stringa
compare nella stringa. r compare nella stringa s.
Risultato ==NULL se non compare. Risultato ==NULL se non compare.

Esempio if(strchr(s,
if '.')!=NULL)... Esempio if(strstr(s,
if "xy")!=NULL)...
if(strchr(s,
if ch)==NULL)... if(strstr(s,
if s1)==NULL)...
41 42
strspn strcspn

Nome funzione strspn Nome funzione strcspn


Libreria #include <string.h> Libreria #include <string.h>
Parametri in s : stringa Parametri in s : stringa
ingresso r : stringa ingresso r : stringa
Valore restituito int : lunghezza sequenza iniziale Valore restituito int : lunghezza sequenza iniziale
Descrizione Calcola la lunghezza della parte Descrizione Calcola la lunghezza della parte
iniziale di s che composta iniziale di s che composta
esclusivamente dei caratteri presenti esclusivamente da caratteri non
in r (in qualsiasi ordine). presenti in r (in qualsiasi ordine).
Esempio lun = strspn(s, " ") ; Esempio lun = strcspn(s, " ") ;
lun = strspn(s, " :,;.") ; lun = strcspn(s, " :,;.") ;
43 44

Conversioni numero-stringa

Definite in atoi
<stdlib.h> atof
Mettono in relazione
un valore numerico
(intero o reale) con la
sua rappresentazione
Funzioni di libreria
come caratteri
allinterno di una In futuro:
stringa sscanf
"372" 372 (int) sprintf
"3.0" 3.0 (float)
46

atoi atof

Nome funzione atoi Nome funzione atof


Libreria #include <stdlib.h> Libreria #include <stdlib.h>
Parametri in s : stringa Parametri in s : stringa
ingresso ingresso
Valore restituito int : valore estratto Valore restituito double/float : valore estratto
double/
Descrizione Analizza la stringa s ed estrae il Descrizione Analizza la stringa s ed estrae il
valore intero in essa contenuto (a valore reale in essa contenuto (a
partire dai primi caratteri). partire dai primi caratteri).

Esempio n = atoi(s) ; Esempio x = atof(s) ;


n = atoi("232abc") ; x = atof("2.32abc") ;
47 48
Esercizi proposti

Esercizio Parola palindroma


Esercizio Iniziali maiuscole
Esercizio Alfabeto farfallino

Caratteri e stringhe

Esercizio Parola palindroma

Sia data una parola inserita da tastiera.


Si consideri che la parola pu contenere sia
caratteri maiuscoli che caratteri minuscoli, e
complessivamente al massimo 30 caratteri
Il programma deve svolgere le seguenti
operazioni:
Esercizi proposti
Visualizzare la parola inserita
Aggiornare la parola in modo che tutti i caratteri
siano minuscoli, e visualizzarla
Verificare se la parola palindroma

Palindromia Analisi

Una parola detta palindroma se pu essere Acquisisci parola


letta indifferentemente da sinistra verso destra e Stampa parola
da destra verso sinistra Converti in minuscolo
Esempi:
Stampa minuscolo
o t t o Verifica se palindroma
Stampa se palindroma

m a d a m

5 6
Analisi Analisi

Acquisisci parola Acquisisci parola


Stampa parola Stampa parola
Converti in minuscolo Converti in minuscolo
const int MAX = 30 ;
Stampa minuscolo Stampa minuscolo
char parola[MAX+1] ; printf("Parola inserita: %s\n",
Verifica se printf("Inserisci
palindroma parola: ") ; Verifica se palindroma
parola) ;
scanf("%s",
Stampa se palindroma parola) ; Stampa se palindroma

7 8

Analisi Analisi

Acquisisci parola Acquisisci parola


printf("Parola minuscola: %s\n",
Stampa parola Stampa parola minusc) ;
Converti in minuscolo Converti in minuscolo
Stampa minuscolo Stampa minuscolo
char minusc[MAX+1] ;
Verifica sei ;palindroma Verifica se palindroma
int
Stampa se palindroma Stampa se palindroma
strcpy(minusc, parola) ;

for(i=0;
for minusc[i]!=0; i++)
{
minusc[i] = tolower( minusc[i] ) ;
} 9 10

Analisi Analisi

int i, j, palin, lun ;


Acquisisci parola Acquisisci parola
Stampa parola i = 0 ; Stampa if(palin==1)
if
parola
printf("E' palindroma\n") ;
Converti in minuscolo
j = strlen( minusc ) - 1 ; Converti in minuscolo
else
Stampa minuscolo Stampa minuscolo
printf("Non e' palindroma\n") ;
palin = 1 ;
Verifica se palindroma Verifica se palindroma
Stampa se while(
palindroma
while i<j && palin==1 ) Stampa se palindroma
{
if(minusc[i]
if != minusc[j])
palin = 0 ;
i++ ; j-- ;
}
11 12
Soluzione

palindroma.c

Esercizi proposti

13

Esercizio Iniziali maiuscole (1/2) Esercizio Iniziali maiuscole (2/2)

Scrivere un programma che legga una frase Il programma deve svolgere le seguenti
introdotta da tastiera operazioni:
La frase terminata dallintroduzione del carattere Visualizzare la frase inserita
di invio Costruire una nuova frase in cui il primo carattere
La frase contiene sia caratteri maiuscoli che di ciascuna parola nella frase di partenza stato
caratteri minuscoli, e complessivamente al pi 100 reso maiuscolo. Tutti gli altri caratteri devono
caratteri essere resi minuscoli
Visualizzare la nuova frase

15 16

Esempio Analisi

La frase inserita pu contenere degli spazi:


occorrer usare gets e non scanf
cHe bElLA gIOrnaTa Ogni lettera inziale di parola va convertita in
maiuscolo
Ogni lettera non iniziale di parola va convertita in
minuscolo
Ogni altro carattere va lasciato immutato
Che Bella Giornata

17 18
Conversione delle lettere

for(i=0;
for frase[i]!=0; i++)
{ iniziali.c

if(
if isalpha(frase[i]) &&
( i==0 || !isalpha(frase[i-1]) ) )
{
frase[i] = toupper( frase[i] ) ;
} Esercizi proposti
else
{
frase[i] = tolower( frase[i] ) ;
}
}

19

Esercizio Alfabeto farfallino (1/2) Esercizio Alfabeto farfallino (2/2)

Scrivere un programma che legga una frase Il programma deve svolgere le seguenti
introdotta da tastiera operazioni:
La frase terminata dallintroduzione del carattere Visualizzare la frase inserita
di invio Costruire una nuova frase nel cosiddetto alfabeto
La frase contiene sia caratteri maiuscoli che farfallino
caratteri minuscoli, e complessivamente al pi 100 Visualizzare la nuova frase
caratteri

21 22

Lalfabeto farfallino Esempio

La traduzione nellalfabeto farfallino di una parola


segue le seguenti regole:
Tutte le consonanti sono tradotte in modo identico Vacanze di NATALE
Ogni vocale tradotta uguale a se stessa, seguita
da altri due caratteri:
la lettera f (se la vocale minuscola) o la lettera F
(se la vocale maiuscola)
una copia della vocale stessa
Vafacafanzefe difi NAFATAFALEFE
Esempi:
a afa
con cofon
23 24
Approccio risolutivo Conversione alfabeto (1/2)

lun = 0 ;
Copiamo la stringa frase in una nuova stringa for(i=0;
for frase[i]!=0; i++)
farfa { if(
if isalpha(frase[i]) ) farfallino.c
lun=0 { /* lettera alfabetica */
Per ogni carattere frase[i] ch = tolower(frase[i]) ;
if(
if ch=='a' || ch=='e' || ch=='i'
Se non una vocale, va accodato a farfa[lun] || ch=='o' || ch=='u' )
Se una vocale, occorre accodare a farfa[lun] { /* vocale: trasforma */
i 3 caratteri: frase[i], poi 'f' o 'F', poi 1 farfa[lun] = frase[i] ;
ancora frase[i] if(isupper(frase[i]))
if
Incrementare lun (di 1 oppure 3) 2 farfa[lun+1] = 'F' ;
Infine aggiungere a farfa[lun] il terminatore else farfa[lun+1] = 'f' ;
3 farfa[lun+2] = frase[i] ;
nullo
lun = lun + 3 ;
25
} 26

Conversione alfabeto (2/2)

else
{
/* consonante: copia */ farfallino.c

farfa[lun] = frase[i] ;
lun++ ;
}
}
else
{
/* altro carattere: copia */
farfa[lun] = frase[i] ;
lun++ ;
}
}
farfa[lun] = 0 ; /* terminatore */
27
Argomenti trattati

Caratteri e stringhe
Il tipo char
Vettori di char
Stringhe: parole, frasi
Operazioni fondamentali sulle stringhe
Caratteri e stringhe Classificazione
Ricerca
Copia e concatenazione
Conversione

Tecniche di programmazione Stringhe e vettori

Terminatore nullo Molte operazioni sulle stringhe sono ricondotte ad


Librerie <string.h> e <ctype.h> analoghe operazioni sui vettori
Manipolazione di stringhe come vettori di Molti problemi astratti su vettori numerici
caratteri assumono forma pi concreta nel caso delle
Manipolazione di stringhe attraverso le funzioni di stringhe
libreria I cicli sono solitamente governati dal controllo del
Identificazione di parole allinterno di frasi terminatore di fine stringa

3 4

Errore frequente Errore frequente

Linput/output nelle stringhe spesso Le stringhe hanno lunghezza variabile; i vettori


problematico che le contengono hanno lunghezza fissa
Utilizzando la funzione scanf, in presenza di possibile, con una chiamata a strcpy o
spazi interni alla stringa rimarranno dei caratteri strcat, scrivere oltre la dimensione del vettore
non letti, che daranno fastidio alle successive Grave errore di programmazione, che pu portare
scanf alla corruzione di dati in altre variabili
Quando possibile, ricorrere alla funzione gets Abituarsi a verificare la lunghezza prima di
per la lettura di una stringa copiare le stringhe
if(strlen(a)
if + strlen(b) + 1 <= MAX)
strcat(a,b) ;
else
5 ERRORE!!! 6
Materiale aggiuntivo

Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo