Programmazione in C e Delphi - Stringhe
Programmazione in C e Delphi - 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
Caratteri e stringhe
8 9
Codice ASCII Caratteri e stringhe
y 7 W ! %
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
y 7 W ! %
121 55 87 33 37
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
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
Cifre
numeriche Spazio
Simboli di bianco
punteggiatura
Caratteri di
controllo
Source: www.lookuptables.com 18 19
Source: www.lookuptables.com Source: www.lookuptables.com
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
25
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
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
char lettera ;
lettera = 'Q' ;
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
Punteggiatura speciale in C
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
ch = getchar() ;
19 20
21 22
ch = getchar() ; ch = getchar() ;
31 32
34
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)
i = ch ; Immetti un carattere: $
Il carattere $ ha codice ASCII 36
printf("Il carattere %c ha codice %d\n",
ch, i) ;
37 38
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
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
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
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
Il tipo stringa
Terminatore nullo
Input/output di stringhe
Caratteri e stringhe
Stringhe in C
B u o n g i o r n o
4
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
9 10
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
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
17 18
Soluzione (1/3) Soluzione (2/3)
i = 0 ;
saluti0.c saluti0.c
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
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
25 26
27 28
29 30
Esempio Conclusione
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
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
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
for(
for i=0 ; src[i] != 0 ; i++ )
dst[i] = src[i] ; /* copia */
9 10
strcpy(dst, src) ; 11 12
Errore frequente
dst[] = src[] ;
dst[MAXD] = src[MAXC] ;
13
S a l v e m o n d o w 1 Q r
15 16
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
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
26
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
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
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
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
46
49 50
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
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
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
63
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
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
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
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
Suggerimenti Rappresentazione
5 6
Convenzioni
9 10
Classificazione di caratteri
12
isalpha isupper
Esempio if(isalpha(ch))
if Esempio if(isupper(ch))
if
{ ... } { ... }
13 14
islower isdigit
Esempio if(islower(ch))
if Esempio if(isdigit(ch))
if
{ ... } { ... }
15 16
isalnum isxdigit
isprint isspace
Esempio if(isprint(ch))
if Esempio if(isspace(ch))
if
{ ... } { ... }
21 22
Spazio isprint
Esempio if(iscntrl(ch))
if
{ ... } Caratteri di Tab
controllo Newline isspace
23 24
iscntrl
Trasformazione di caratteri
Funzioni di libreria
26
toupper tolower
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
strcat strncat
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
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
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
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
Caratteri e stringhe
Palindromia Analisi
m a d a m
5 6
Analisi Analisi
7 8
Analisi Analisi
for(i=0;
for minusc[i]!=0; i++)
{
minusc[i] = tolower( minusc[i] ) ;
} 9 10
Analisi Analisi
palindroma.c
Esercizi proposti
13
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
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
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
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
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
3 4
Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo