LEZIONI DI
PROGRAMMAZIONE IN
“Le stringhe”
Ing. Cristian Randieri
Università degli Studi di Catania
Istituto Nazionale di Fisica Nucleare (INFN)
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Introduzione
In C non esiste un vero e proprio
tipo di dato “Stringa”.
Le stringhe sono gestite dal
compilatore come sequenze di
caratteri, cioè di dati di tipo char.
Esistono due metodi comunemente
utilizzati per dichiarare e
manipolare stringhe nei programmi
ovvero mediante l’uso:
 degli array;
 dei puntatori.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Le stringhe e gli array
In C uno degli utilizzi degli array ad una
dimensione riguarda la conservazione in
memoria di stringhe di caratteri: queste in C
sono array di tipo carattere la cui fine è
segnalata da un carattere null (carattere
terminatore), indicato come '0'.
Il carattere null è il primo codice ASCII
corrispondente al valore binario 00000000 e
non ha niente a che vedere con il carattere 0
che ha, in ASCII, codice binario 00110000.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Esempio
char a[10];
dichiara un vettore costituito da un massimo di
dieci caratteri e:
char frase[] = "Oggi c'è il sole";
dichiara l'array monodimensionale frase il cui
numero di caratteri è determinato dalla
quantità di caratteri presenti fra doppi apici più
uno (il carattere null che chiude la stringa).
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Assegnazione di valori
È importante notare la differenza tra le due
assegnazioni:
char a = 'r';
char b[] = "r";
Nel primo caso viene assegnato il solo carattere
r, nel secondo la stringa r0. In definitiva: se
si vuole fare riferimento ad un solo carattere,
questo deve essere racchiuso fra apici singoli;
se, invece, si vuole fare riferimento ad una
stringa, occorre racchiuderla fra doppi apici.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Funzioni per il trattamento
delle stringhe
Nonostante il linguaggio C non
possieda un dato di tipo stringa, sono
disponibili parecchie funzioni specifiche
per il trattamento di quest’ultime:
 gets e puts
 strcpy
 strcat, strlen e strcmp
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Funzioni “gets” e “puts”
Le funzioni gets e puts sono funzioni specializzate
nell'input e output di una stringa. Il programma
seguente riceve in input una stringa e, subito dopo,
la rimanda in output.
Notare che in queste istruzioni si fa riferimento alla
stringa nel suo complesso e, quindi, viene utilizzato
il nome:
#include <stdio.h>
main() {
char s[80]; /* dichiara la stringa */
gets(s); /* riceve l'input */
puts(s); /* fornisce l'output */
}
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Altre funzioni per il trattamento delle stringhe
sono disponibili, per usi particolari, a patto che
si includa nel programma la libreria delle
funzioni “string” mediante la seguente
istruzione:
#include <string.h>
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Funzione “strcpy”
Questa funzione copia una stringa in un'altra.
Può essere utilizzata, per esempio, per
assegnare un valore a una stringa. La sua
sintassi è:
strcpy(s1,s2);
Si può immaginare che tale funzione equivale,
come effetto, all'assegnamento nelle variabili
di altro tipo (in altri termini è come se si
scrivesse: s1=s2) assegna, cioè, alla stringa
s1 il valore contenuto in s2.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Funzione “strcat”
La funzione:
strcat(s1,s2);
concatena la stringa s2 alla fine della stringa s1:
strcpy(s1,"buon"); /* stringa specificata
in s1 */
strcpy(s2,"giorno"); /* lo stesso per s2
*/
strcat(s1,s2); /* s1 conterrà "buongiorno"
*/
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Funzione ” strlen ”
La funzione:
strlen(s1);
restituisce un valore numerico
che rappresenta la lunghezza
della stringa s1.
Es. a=strlen (s1);
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Funzione “strcmp”
La funzione:
strcmp(s1,s2);
può essere utilizzata per effettuare
comparazioni sul contenuto di due stringhe.
In particolare tale funzione:
Restituisce un valore positivo se vale s1>s2
Restituisce un valore negativo se vale s1<s2
Restituisce 0 se s1 ed s2 sono uguali
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Funzione “strcmp”
Per tenere conto mnemonicamente di
tali valori, basta pensare al confronto
come ad una sottrazione: fra l’altro ciò è
non è molto distante da quello che
avviene in effetti.
Se da s1 si sottrae s2 si avrà un valore
positivo nel caso s1>s2, negativo se
s1<s2 e nullo se sono uguali.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Esempio
#include <stdio.h>
#include <string.h>
main(){
char S1[10],S2[10]; /* dichiara le
stringhe */
gets (S1);
gets (S2);
if (strcmp (S1,S2)==0)
printf("n Le parole sono uguali ");
else
printf("n Le parole sono diverse
");
}
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Array di stringhe
Una applicazione interessante delle matrici è
l’array di stringhe.
La stringa è un array di caratteri e quindi
potremmo dire che un array di stringhe è un
array di array di caratteri.
Per chiarire la gestione di questo tipo di array
esaminiamo un programma che si occupa di
cercare delle parole in un vocabolario e ci dica,
per ognuna, se è contenuta nel vocabolario
stesso:
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Programma esempio
/* Cerca parole in un vocabolario */
#include <stdio.h>
#include <string.h> /*1*/
main(){
char vocab[10][20], parcerc[20]; /*2*/
int i,trovata;
/* Acquisisce parole da inserire nel
vocabolario */
for (i=0;i<=9;i++) {
printf("nParola %d ",i);
gets(vocab[i]); /*3*/
}
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Programma esempio
/* Acquisisce la parola da cercare */
printf("nnParola da cercare (Invio per finire)
");
gets(parcerc);
while (strcmp(parcerc,"")) { /*4*/
/* Cerca la parola */
trovata=0; /*5*/
for (i=0;i<=9;i++) {
if (!strcmp(parcerc,vocab[i])) { /*6*/
trovata=1; /*7*/
break; /*8*/
}
}
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Programma esempio
if (trovata) /*9*/
printf("nParola trovata");
else
printf("nParola non trovata");
/* Prossima parola da cercare */
printf("nnParola da cercare (Invio
per finire) ");
gets(parcerc);
}
}
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
#include <string.h> /*1*/
La dichiarazione della riga 1
permette l’utilizzo all’interno
del programma delle funzioni
per il trattamento delle
stringhe.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
char vocab[10][20], parcerc[20]; /*2*/
Nella riga 2 viene dichiarato l’array di caratteri
vocab[10][20]. Il nostro vocabolario conterrà
quindi un massimo di 10 parole ognuna composta di
un massimo di 20 caratteri. La prima parola è
contenuta in vocab[0] e con vocab[2][7],
qualora dovesse interessare, si individuerebbe
l’ottavo carattere della terza parola del vocabolario.
Ogni riga della tabella conterrà una parola e in ogni
colonna ci sono i caratteri che compongono le
parole. L’array parcerc[20] servirà per contenere
la parola da cercare.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
gets(vocab[i]); /*3*/
Nella riga 3 si acquisiscono le parole da inserire nel
vocabolario: la prima volta l’istruzione si leggerà
gets(vocab[0]), quindi gets(vocab[1]) e infine
gets(vocab[9]) in relazione ai diversi valori assunti
dal contatore i.
L’uso di un solo indice dipende dal fatto che, con la gets,
si acquisisce una stringa e quindi nel nostro caso una
intera riga della matrice.
Se avessimo voluto acquisire le stringhe un carattere per
volta, si sarebbero dovuti gestire due cicli uno annidato
nell’altro, contenenti l’istruzione
scanf("%c",&vocab[i][j]).
Alla fine avremmo dovuto aggiungere il carattere null.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
while (strcmp(parcerc,"")) { /*4*/
Nella riga 4 si gestisce la condizione di uscita dal ciclo.
La stringa ricevuta dall’input viene comparata con la
stringa vuota (due doppi apici consecutivi): se alla
richiesta di input della stringa da cercare si risponde
premendo solamente il tasto Invio, viene acquisita una
stringa contenente solo il carattere terminatore null.
Ciò rende falsa la condizione e quindi il ciclo ha
termine (strcmp in questo caso restituisce 0).
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
trovata=0; /*5*/
La variabile trovata che viene azzerata nella riga 5
registrerà l’eventuale ritrovamento della stringa
all’interno del vocabolario.
Il valore assegnato non ha il senso di un valore
numerico a tutti gli effetti ma il senso di un valore
logico (0 = falso, un valore non nullo=vero).
Una variabile usata in questo modo viene chiamata
solitamente variabile logica, switch o flag.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
if (!strcmp(parcerc,vocab[i])) { /*6*/
Nella 6 si confronta la parola da
cercare via via con le parole contenute
nel vocabolario.
L’equivalenza delle due stringhe, quella
da cercare e la parola del vocabolario
esaminata, rende vera la condizione.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
trovata=1; /*7*/
break; /*8*/
In questo caso, riga 7, si rende vera
la variabile trovata assegnandole un
valore non nullo e con la break della
riga 8 si forza l’uscita dal ciclo
poiché è inutile continuare a
confrontare la parola cercata con il
resto delle parole del vocabolario: la
ricerca viene sospesa.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
if (trovata) /*9*/
Nella riga 9 si esegue un test sul flag trovata: se
è vero (cioè è stata eseguita l’istruzione della riga 7)
la parola è stata trovata, se è falso (è rimasto
inalterato il valore assegnato nella istruzione della
riga 5) la ricerca ha avuto esito negativo.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Le stringhe e i puntatori
Un metodo comunemente
utilizzato per dichiarare e
manipolare stringhe nei
programmi è offerto dai
puntatori.
Come si vede nel
programma dell'esempio
seguente, che visualizza
"Ciao Ciao" e porta a
capo il cursore.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Esempio
#include <stdio.h>
char *string = "Ciao";
void main(void)
{
printf(string);
printf(" %s
n",string);
}
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
char *string = "Ciao";
La dichiarazione di string può apparire, a prima vista,
anomala.
Si tratta infatti, a tutti gli effetti, della dichiarazione di
un puntatore e la stranezza consiste nel fatto che a
questo non è assegnato un indirizzo di memoria, come
ci si potrebbe aspettare, bensì una costante stringa.
Ma è proprio questo l'artificio che consente di gestire le
stringhe con normali puntatori a carattere: il
compilatore, in realtà, assegna a string, puntatore a
16 bit, l'indirizzo della costante "Ciao".
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
Dunque la word occupata da string non contiene la
parola "Ciao", ma i 16 bit che esprimono la parte
offset del suo indirizzo.
A sua volta, "Ciao" occupa 5 byte di memoria.
Proprio 5, non si tratta di un errore di stampa: i 4 byte
necessari a memorizzare i 4 caratteri che compongono
la parola, più un byte, nel quale il compilatore
memorizza il valore binario 0, detto terminatore di
stringa o null terminator.
In C, tutte le stringhe sono chiuse da un null
terminator, ed occupano perciò un byte in più del
numero di caratteri "stampabili" che le compongono.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
printf(string);
La prima chiamata a printf() passa quale
argomento proprio string: dunque la stringa
parametro indispensabile di printf() non deve
essere necessariamente una stringa di formato
quando l'unica cosa da visualizzare sia proprio una
stringa. Lo è, però, quando devono essere visualizzati
caratteri o numeri, o stringhe formattate in un modo
particolare, come avviene nella seconda chiamata.
printf(" %s n",string);
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Osservazioni
Per visualizzare una stringa con printf() occore
fornirne l'indirizzo, che nel nostro caso è il contenuto
del puntatore string.
Se string punta alla stringa "Ciao", che cosa
restituisce l'espressione *string?
La tentazione di rispondere "Ciao" è forte, ma se così
fosse perché per visualizzare la parola occorre passare
a printf() string e non *string?
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Osservazioni
Il problema non si poneva con gli esempi precedenti,
perché tutti i puntatori esaminati indirizzavano un
unico dato di un certo tipo.
Con le dichiarazioni:
float numero = 12.5;
float *numPtr = &numero;
si definisce il puntatore numPtr e lo si inizializza in
modo che contenga l'indirizzo della variabile numero,
la quale, in fondo proprio come string, occupa più di
un byte. In questo caso, però, i 4 byte di numero
contengono un dato unitariamente considerato.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Osservazioni
In altre parole, nessuno dei 4 byte che la compongono
ha significato in sé e per sé.
Con riferimento a string, al contrario, ogni byte è un
dato a sé stante, cioè un dato di tipo char: bisogna
allora precisare che un puntatore indirizza sempre il
primo byte di tutti quelli che compongono il tipo di
dato considerato, se questi sono più d'uno.
Se ne ricava che string contiene, in realtà, l'indirizzo
del primo carattere di "Ciao", cioè la 'C'.
Allora *string non può che restituire proprio quella,
come si può facilmente verificare con la seguente
chiamata a printf():
printf("%c è il primo carattere...n",*string);
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Le stringhe come sequenze di
caratteri
Le stringhe sono, per il compilatore C, semplici
sequenze di char: la stringa del nostro esempio:
char *string = "Ciao";
inizia con il char che si trova all'indirizzo contenuto
in string (la 'C') e termina con il primo byte nullo
incontrato ad un indirizzo uguale o superiore a quello
del primo carattere (nell’esempio il byte che segue
immediatamente la 'o').
Per accedere ai caratteri che seguono il primo è
sufficiente incrementare il puntatore o, comunque,
sommare ad esso una opportuna quantità (che
rappresenta l'offset, cioè lo spostamento, dall'inizio
della stringa stessa).
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Esempio
int i = 0;
while(*(string+i) != 0)
{ printf("%cn",*(string+i));
++i; }
L'esempio si basa sull'aritmetica dei puntatori, cioè
sulla possibilità di accedere ai dati memorizzati ad un
certo offset rispetto ad un indirizzo sommandovi
algebricamente numeri interi.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
while(*(string+i) != 0)
{ printf("%cn",*(string+i));
++i; }
Il ciclo visualizza la stringa "Ciao" in senso verticale.
Infatti l'istruzione while esegue le istruzioni comprese
tra le parentesi graffe finché la condizione espressa tra
le parentesi tonde è vera (se questa è falsa la prima
volta, il ciclo non viene mai eseguito): in questo caso
la printf() è eseguita finché il byte che si trova
all'indirizzo contenuto in string aumentato di i unità
è diverso da 0, cioè finché non viene incontrato il null
terminator.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
printf("%cn",*(string+i));
La printf() visualizza il byte a quello stesso indirizzo
e va a capo.
Il valore di i è inizialmente 0, pertanto nella prima
iterazione l'indirizzo espresso da string non è
modificato, ma ad ogni loop i è incrementato di 1
(tale è il significato dell'operatore ++), pertanto ad
ogni successiva iterazione l'espressione string+i
restituisce l'indirizzo del byte successivo a quello
appena visualizzato.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Descrizione
Al termine, i contiene il valore 4, che è anche la
lunghezza della stringa: questa è infatti
convenzionalmente pari al numero dei caratteri
stampabili che compongono la stringa stessa; il null
terminator non viene considerato.
int i = 0;
while(*(string+i) != 0)
{ printf("%cn",*(string+i));
++i; }
In altre parole la lunghezza di una stringa è inferiore di 1
al numero di byte che essa occupa effettivamente in
memoria.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Lunghezza di una stringa
La lunghezza di una stringa può quindi essere calcolata
così:
unsigned i = 0;
while(*(string+i)) ++i;
La condizione tra parentesi è implicita: non viene
specificato alcun confronto.
In casi come questo il compilatore assume che il
confronto vada effettuato con il valore 0, che è proprio
quel che fa al nostro caso.
Inoltre, dato che il ciclo si compone di una sola riga
(l'autoincremento di i), le graffe non sono necessarie.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Osservazione
Quando ad una funzione viene passata una
costante stringa, come in:
printf("Ciao!n");
il compilatore, astutamente, memorizza la
costante e ne passa l'indirizzo.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Esempio: modifica di una
stringa
char *string = "Rosson";
Void main(void)
{ printf(string);
*(string+3) = 'p';
printf(string);
}
Il programma dell'esempio visualizza dapprima la
parola "Rosso" e poi "Rospo".
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Osservazioni
Il valore di string non è mutato: esso continua a
puntare alla medesima locazione di memoria, ma è
mutato il contenuto del byte che si trova ad un offset di
3 rispetto a quell'indirizzo.
Dal momento che l'indirezione di un puntatore a
carattere restituisce un carattere, nell'assegnazione
della lettera 'p' è necessario esprimere quest'ultima
come un char, e pertanto tra apici (e non tra
virgolette).
La variabile string non a casp è dichiarata all'esterno
di main().
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Come troncare una stringa
Per troncare una stringa basta inserire un NULL
dove occorre:
*(string+2) = NULL;
A questo punto una chiamata a printf()
visualizzerebbe la parola "Ro".
NULL è una costante manifesta definita in
STDIO.H, e rappresenta lo zero binario; infatti la
riga di codice precedente potrebbe essere scritta
così:
*(string+2) = 0;
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Come allungare una stringa
Se si sovrascrive il NULL con un carattere, la stringa si allunga sino
al successivo NULL.
Occorre fare alcune considerazioni:
 in primo luogo, tale operazione ha senso, di solito, solo nel caso
di concatenamento di stringhe (quando cioè si desidera
accodare una stringa ad un'altra per produrne una sola, più
lunga).
 In secondo luogo, se i byte successivi al NULL sono occupati da
altri dati, questi vengono perduti, sovrascritti dai caratteri
concatenati alla stringa: l'effetto può essere disastroso.
 Abbiamo visto che esiste una funzione di libreria concepita
appositamente per concatenare le stringhe: la strcat(), che
richiede due stringhe quali parametri. L'azione da essa svolta
consiste nel copiare i byte che compongono la seconda stringa,
NULL terminale compreso, in coda alla prima stringa,
sovrascrivendone il NULL terminale.
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
Osservazioni
In una dichiarazione come quella di string, il
compilatore riserva alla stringa lo spazio
strettamente necessario a contenere i caratteri
che la compongono, più il NULL.
E' evidente che concatenare a string un'altra
stringa sarebbe un grave errore (peraltro non
segnalato dal compilatore, perché esso lascia il
programmatore libero di gestire la memoria
come crede: se sbaglia, peggio per lui).
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
E' meglio sottolineare che le librerie standard
del C comprendono un gran numero di
funzioni (dichiarate in STRING.H) per la
manipolazione delle stringhe, che effettuano
le più svariate operazioni: copiare stringhe o
parte di esse (strcpy(), strncpy()),
concatenare stringhe (strcat(),
strncat()), confrontare stringhe
(strcmp(), stricmp()), ricercare
sottostringhe o caratteri all'interno di stringhe
(strstr(), strchr(), strtok())...
Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe”
FINE

More Related Content

PDF
Algoritmo probabilistico di tipo montecarlo per il list decoding
PDF
Algoritmo probabilistico di tipo montecarlo per il list decoding elaborato
PPT
Corso c++
PDF
Pillole di C++
PPT
Java Lezione 1
PPSX
Informatica di base
KEY
Pycrashcourse
PPT
Riepilogo Java C/C++
Algoritmo probabilistico di tipo montecarlo per il list decoding
Algoritmo probabilistico di tipo montecarlo per il list decoding elaborato
Corso c++
Pillole di C++
Java Lezione 1
Informatica di base
Pycrashcourse
Riepilogo Java C/C++

What's hot (20)

PDF
Soluzioni abilità informatiche 16 maggio 2012
PPT
3 Linguaggioc
PPT
5 Strutture Iterative
PDF
Le basi di Pytthon 3 - Fondamenti n.1
PDF
Soluzione esame b del 13 giugno 2012
PDF
12 - Programmazione: Array dinamici e puntatori
PDF
Python - Primi passi
PDF
Lezione 12 (28 marzo 2012)
PPT
05 1 intro-struttura
PPT
9 Altre Istruzioni Di I O
PPT
Stringhe java
PDF
10 - Programmazione: Tipi di dato strutturati
PPTX
06 3 struct
PDF
PDF
11 - Programmazione: Tipi di dato strutturati pt. 2
PDF
Algorithmist guide II
PPT
05 2 integrali-conversioni-costanti-preproc-inclusione
PDF
Vogliamo programmatori stupidi e pigri!
PDF
Flow chart
PDF
Lezione 1 (27 febbraio 2012)
Soluzioni abilità informatiche 16 maggio 2012
3 Linguaggioc
5 Strutture Iterative
Le basi di Pytthon 3 - Fondamenti n.1
Soluzione esame b del 13 giugno 2012
12 - Programmazione: Array dinamici e puntatori
Python - Primi passi
Lezione 12 (28 marzo 2012)
05 1 intro-struttura
9 Altre Istruzioni Di I O
Stringhe java
10 - Programmazione: Tipi di dato strutturati
06 3 struct
11 - Programmazione: Tipi di dato strutturati pt. 2
Algorithmist guide II
05 2 integrali-conversioni-costanti-preproc-inclusione
Vogliamo programmatori stupidi e pigri!
Flow chart
Lezione 1 (27 febbraio 2012)
Ad

Viewers also liked (17)

PDF
Targa Naro Campionati Siciliani
PDF
4 Corso introduttivo al Golf - TIM
PDF
Introduzione alla Domotica vantaggi e prospettive - Progettare un impianto Do...
PDF
Coaching y liderazgo_personal
PPTX
Document management system and scanning software
PDF
THE KEY WORLD LAW ONE MUST KNOW: AB REVERSIBILITY PRINCIPLE: Prime-Principle ...
PDF
Comparison of 2mm HiRel Connectors to the Mil Std
PDF
Oude adreskaarten in steen en hout te Dokkum
PPTX
Productivity Network
PPTX
Cisco Spark and Tropo and the Programmable Web
PDF
حل جميع اسئلة الكتاب المدرسى المطالعة واهم الاسئلة بصيغة جميله استاذ محمود حلمي
PDF
แนวข้อสอบประมวล Radompon
PPTX
+Conférence "Définir un projet professionnel porteur de sens et de bonheur", ...
PDF
129 Automazione e manutenzione predittiva nell’era del cloud - Automazione Og...
PPTX
Ethical leadership
PDF
Offline Drupal with progressive web app
PPTX
成功するスタートアップの作り方 ー 完全版
Targa Naro Campionati Siciliani
4 Corso introduttivo al Golf - TIM
Introduzione alla Domotica vantaggi e prospettive - Progettare un impianto Do...
Coaching y liderazgo_personal
Document management system and scanning software
THE KEY WORLD LAW ONE MUST KNOW: AB REVERSIBILITY PRINCIPLE: Prime-Principle ...
Comparison of 2mm HiRel Connectors to the Mil Std
Oude adreskaarten in steen en hout te Dokkum
Productivity Network
Cisco Spark and Tropo and the Programmable Web
حل جميع اسئلة الكتاب المدرسى المطالعة واهم الاسئلة بصيغة جميله استاذ محمود حلمي
แนวข้อสอบประมวล Radompon
+Conférence "Définir un projet professionnel porteur de sens et de bonheur", ...
129 Automazione e manutenzione predittiva nell’era del cloud - Automazione Og...
Ethical leadership
Offline Drupal with progressive web app
成功するスタートアップの作り方 ー 完全版
Ad

Similar to Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intellisystem.it (20)

PDF
Sistemi Operativi: Il kernel linux - Lezione 06
PDF
LINQ, Entities Framework & ORMs
PPTX
PDF
Lezione 6 (12 marzo 2012)
PDF
Lezione 12 (28 marzo 2012)
PPT
R Vectors
PDF
Lezione 8 (12 marzo 2012)
PDF
Lezione5 - MIPS & SPIM Unicam
PPTX
What's new in C# 7
PPTX
What is new in C# 2018
PPT
Php Funzioni Built In Barbiera 97
PDF
Ecdl modulo 1 -Fondamenti
PPTX
Syntactical errors detection 1
PDF
Lezione 16 (2 aprile 2012)
PDF
Lezione 15 (2 aprile 2012)
PDF
Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...
PDF
Slides introduttive alla programmazione del linguaggio Python
PPTX
Rest sdk
PDF
Lezione 1 (27 febbraio 2012)
PDF
Lezione 5 (7 marzo 2012)
Sistemi Operativi: Il kernel linux - Lezione 06
LINQ, Entities Framework & ORMs
Lezione 6 (12 marzo 2012)
Lezione 12 (28 marzo 2012)
R Vectors
Lezione 8 (12 marzo 2012)
Lezione5 - MIPS & SPIM Unicam
What's new in C# 7
What is new in C# 2018
Php Funzioni Built In Barbiera 97
Ecdl modulo 1 -Fondamenti
Syntactical errors detection 1
Lezione 16 (2 aprile 2012)
Lezione 15 (2 aprile 2012)
Lezioni di programmazione in c i file By Cristian Randieri - www.intellisyste...
Slides introduttive alla programmazione del linguaggio Python
Rest sdk
Lezione 1 (27 febbraio 2012)
Lezione 5 (7 marzo 2012)

More from Cristian Randieri PhD (20)

PDF
IT-ISS 3000 CONTROLLER - Accessories & Controller
PDF
It 2 x-2hdmi-datasheet
PDF
IT-VCHD90-PRO - Videoconference & Telemedicine – Video System
PDF
148 La comunicazione via satellite per la business continuity ed il disaster ...
PDF
147 Industria 4.0: L’automazione per l’eccellenza del settore alimentare - I ...
PDF
146 63° Congresso del CNI - Aggregazione e Comunicazione: Facciamo Rete con l...
PDF
145 Internazionalizzazione ed innovazione: le chiavi per uscire dalla crisi c...
PDF
144 Green Energy - Intervista a Cristian Randieri - I figli di Archimede N. 2...
PDF
PDF
139 Tavola Rotonda “Edge e Cloud Computing” - Automazione Oggi N. 399 – Giugn...
PDF
138 Identificazione e tracciabilità nell’era dell’IoT: unconventional, smart ...
PDF
136 Packaging: riprende la corsa delle tecnologie Made in Italy - Automazione...
PDF
133 Tavola Rotonda “Marcia indietro" - Automazione Oggi N. 396 – Marzo 2017 -...
PDF
132 Soluzioni satellitari integrate per il controllo remoto dei sistemi TV Br...
PDF
131 Curarsi con la tecnologia - Il punto di vista di Intellisystem Technologi...
PDF
130 FN 90 Febbraio 2017 - Tavola Rotonda L'analisi tanto attesa - Fieldbus & ...
PDF
128 Tavola Rotonda Lavorare ‘mobile’: potenzialità e criticità - Fieldbus & N...
PDF
124 SISTEMI DI SICUREZZA SEMPRE PIÙ “VERSO LA NUVOLA” - Safety & Security N. ...
PDF
122 Ispezione di linee aeree - Automazione Oggi N. 393 – Ottobre 2016 - Cris...
PDF
121 Il punto sulla meccatronica - Embedded N. 61 – Settembre 2016 - Cristian ...
IT-ISS 3000 CONTROLLER - Accessories & Controller
It 2 x-2hdmi-datasheet
IT-VCHD90-PRO - Videoconference & Telemedicine – Video System
148 La comunicazione via satellite per la business continuity ed il disaster ...
147 Industria 4.0: L’automazione per l’eccellenza del settore alimentare - I ...
146 63° Congresso del CNI - Aggregazione e Comunicazione: Facciamo Rete con l...
145 Internazionalizzazione ed innovazione: le chiavi per uscire dalla crisi c...
144 Green Energy - Intervista a Cristian Randieri - I figli di Archimede N. 2...
139 Tavola Rotonda “Edge e Cloud Computing” - Automazione Oggi N. 399 – Giugn...
138 Identificazione e tracciabilità nell’era dell’IoT: unconventional, smart ...
136 Packaging: riprende la corsa delle tecnologie Made in Italy - Automazione...
133 Tavola Rotonda “Marcia indietro" - Automazione Oggi N. 396 – Marzo 2017 -...
132 Soluzioni satellitari integrate per il controllo remoto dei sistemi TV Br...
131 Curarsi con la tecnologia - Il punto di vista di Intellisystem Technologi...
130 FN 90 Febbraio 2017 - Tavola Rotonda L'analisi tanto attesa - Fieldbus & ...
128 Tavola Rotonda Lavorare ‘mobile’: potenzialità e criticità - Fieldbus & N...
124 SISTEMI DI SICUREZZA SEMPRE PIÙ “VERSO LA NUVOLA” - Safety & Security N. ...
122 Ispezione di linee aeree - Automazione Oggi N. 393 – Ottobre 2016 - Cris...
121 Il punto sulla meccatronica - Embedded N. 61 – Settembre 2016 - Cristian ...

Recently uploaded (11)

PDF
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
PPTX
San Giovanni Eudes, 1601 – 1680, sacerdote e fondatore francese.pptx
PDF
PRESENTAZIONE PROGETTO CCCI IN ITALIANO .pdf
PDF
Critico_o_creativo_Approcci_al_testo_let.pdf
PDF
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
PDF
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
PPTX
Santa Rosa da Lima, Vergine, Penitente, Terziaria Domenicana 1586-1617.pptx
PDF
Presentazione su educazione finanziaria e gestione della liquidità
PDF
Presentazione di Chimica sui Coloranti Alimentari
PDF
Libro per insegnare di Balboni: Lingue_e_linguaggi.pdf
PDF
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
San Giovanni Eudes, 1601 – 1680, sacerdote e fondatore francese.pptx
PRESENTAZIONE PROGETTO CCCI IN ITALIANO .pdf
Critico_o_creativo_Approcci_al_testo_let.pdf
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
Santa Rosa da Lima, Vergine, Penitente, Terziaria Domenicana 1586-1617.pptx
Presentazione su educazione finanziaria e gestione della liquidità
Presentazione di Chimica sui Coloranti Alimentari
Libro per insegnare di Balboni: Lingue_e_linguaggi.pdf
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...

Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intellisystem.it

  • 1. LEZIONI DI PROGRAMMAZIONE IN “Le stringhe” Ing. Cristian Randieri Università degli Studi di Catania Istituto Nazionale di Fisica Nucleare (INFN)
  • 2. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Introduzione In C non esiste un vero e proprio tipo di dato “Stringa”. Le stringhe sono gestite dal compilatore come sequenze di caratteri, cioè di dati di tipo char. Esistono due metodi comunemente utilizzati per dichiarare e manipolare stringhe nei programmi ovvero mediante l’uso:  degli array;  dei puntatori.
  • 3. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Le stringhe e gli array In C uno degli utilizzi degli array ad una dimensione riguarda la conservazione in memoria di stringhe di caratteri: queste in C sono array di tipo carattere la cui fine è segnalata da un carattere null (carattere terminatore), indicato come '0'. Il carattere null è il primo codice ASCII corrispondente al valore binario 00000000 e non ha niente a che vedere con il carattere 0 che ha, in ASCII, codice binario 00110000.
  • 4. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Esempio char a[10]; dichiara un vettore costituito da un massimo di dieci caratteri e: char frase[] = "Oggi c'è il sole"; dichiara l'array monodimensionale frase il cui numero di caratteri è determinato dalla quantità di caratteri presenti fra doppi apici più uno (il carattere null che chiude la stringa).
  • 5. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Assegnazione di valori È importante notare la differenza tra le due assegnazioni: char a = 'r'; char b[] = "r"; Nel primo caso viene assegnato il solo carattere r, nel secondo la stringa r0. In definitiva: se si vuole fare riferimento ad un solo carattere, questo deve essere racchiuso fra apici singoli; se, invece, si vuole fare riferimento ad una stringa, occorre racchiuderla fra doppi apici.
  • 6. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Funzioni per il trattamento delle stringhe Nonostante il linguaggio C non possieda un dato di tipo stringa, sono disponibili parecchie funzioni specifiche per il trattamento di quest’ultime:  gets e puts  strcpy  strcat, strlen e strcmp
  • 7. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Funzioni “gets” e “puts” Le funzioni gets e puts sono funzioni specializzate nell'input e output di una stringa. Il programma seguente riceve in input una stringa e, subito dopo, la rimanda in output. Notare che in queste istruzioni si fa riferimento alla stringa nel suo complesso e, quindi, viene utilizzato il nome: #include <stdio.h> main() { char s[80]; /* dichiara la stringa */ gets(s); /* riceve l'input */ puts(s); /* fornisce l'output */ }
  • 8. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Altre funzioni per il trattamento delle stringhe sono disponibili, per usi particolari, a patto che si includa nel programma la libreria delle funzioni “string” mediante la seguente istruzione: #include <string.h>
  • 9. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Funzione “strcpy” Questa funzione copia una stringa in un'altra. Può essere utilizzata, per esempio, per assegnare un valore a una stringa. La sua sintassi è: strcpy(s1,s2); Si può immaginare che tale funzione equivale, come effetto, all'assegnamento nelle variabili di altro tipo (in altri termini è come se si scrivesse: s1=s2) assegna, cioè, alla stringa s1 il valore contenuto in s2.
  • 10. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Funzione “strcat” La funzione: strcat(s1,s2); concatena la stringa s2 alla fine della stringa s1: strcpy(s1,"buon"); /* stringa specificata in s1 */ strcpy(s2,"giorno"); /* lo stesso per s2 */ strcat(s1,s2); /* s1 conterrà "buongiorno" */
  • 11. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Funzione ” strlen ” La funzione: strlen(s1); restituisce un valore numerico che rappresenta la lunghezza della stringa s1. Es. a=strlen (s1);
  • 12. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Funzione “strcmp” La funzione: strcmp(s1,s2); può essere utilizzata per effettuare comparazioni sul contenuto di due stringhe. In particolare tale funzione: Restituisce un valore positivo se vale s1>s2 Restituisce un valore negativo se vale s1<s2 Restituisce 0 se s1 ed s2 sono uguali
  • 13. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Funzione “strcmp” Per tenere conto mnemonicamente di tali valori, basta pensare al confronto come ad una sottrazione: fra l’altro ciò è non è molto distante da quello che avviene in effetti. Se da s1 si sottrae s2 si avrà un valore positivo nel caso s1>s2, negativo se s1<s2 e nullo se sono uguali.
  • 14. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Esempio #include <stdio.h> #include <string.h> main(){ char S1[10],S2[10]; /* dichiara le stringhe */ gets (S1); gets (S2); if (strcmp (S1,S2)==0) printf("n Le parole sono uguali "); else printf("n Le parole sono diverse "); }
  • 15. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Array di stringhe Una applicazione interessante delle matrici è l’array di stringhe. La stringa è un array di caratteri e quindi potremmo dire che un array di stringhe è un array di array di caratteri. Per chiarire la gestione di questo tipo di array esaminiamo un programma che si occupa di cercare delle parole in un vocabolario e ci dica, per ognuna, se è contenuta nel vocabolario stesso:
  • 16. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Programma esempio /* Cerca parole in un vocabolario */ #include <stdio.h> #include <string.h> /*1*/ main(){ char vocab[10][20], parcerc[20]; /*2*/ int i,trovata; /* Acquisisce parole da inserire nel vocabolario */ for (i=0;i<=9;i++) { printf("nParola %d ",i); gets(vocab[i]); /*3*/ }
  • 17. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Programma esempio /* Acquisisce la parola da cercare */ printf("nnParola da cercare (Invio per finire) "); gets(parcerc); while (strcmp(parcerc,"")) { /*4*/ /* Cerca la parola */ trovata=0; /*5*/ for (i=0;i<=9;i++) { if (!strcmp(parcerc,vocab[i])) { /*6*/ trovata=1; /*7*/ break; /*8*/ } }
  • 18. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Programma esempio if (trovata) /*9*/ printf("nParola trovata"); else printf("nParola non trovata"); /* Prossima parola da cercare */ printf("nnParola da cercare (Invio per finire) "); gets(parcerc); } }
  • 19. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione #include <string.h> /*1*/ La dichiarazione della riga 1 permette l’utilizzo all’interno del programma delle funzioni per il trattamento delle stringhe.
  • 20. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione char vocab[10][20], parcerc[20]; /*2*/ Nella riga 2 viene dichiarato l’array di caratteri vocab[10][20]. Il nostro vocabolario conterrà quindi un massimo di 10 parole ognuna composta di un massimo di 20 caratteri. La prima parola è contenuta in vocab[0] e con vocab[2][7], qualora dovesse interessare, si individuerebbe l’ottavo carattere della terza parola del vocabolario. Ogni riga della tabella conterrà una parola e in ogni colonna ci sono i caratteri che compongono le parole. L’array parcerc[20] servirà per contenere la parola da cercare.
  • 21. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione gets(vocab[i]); /*3*/ Nella riga 3 si acquisiscono le parole da inserire nel vocabolario: la prima volta l’istruzione si leggerà gets(vocab[0]), quindi gets(vocab[1]) e infine gets(vocab[9]) in relazione ai diversi valori assunti dal contatore i. L’uso di un solo indice dipende dal fatto che, con la gets, si acquisisce una stringa e quindi nel nostro caso una intera riga della matrice. Se avessimo voluto acquisire le stringhe un carattere per volta, si sarebbero dovuti gestire due cicli uno annidato nell’altro, contenenti l’istruzione scanf("%c",&vocab[i][j]). Alla fine avremmo dovuto aggiungere il carattere null.
  • 22. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione while (strcmp(parcerc,"")) { /*4*/ Nella riga 4 si gestisce la condizione di uscita dal ciclo. La stringa ricevuta dall’input viene comparata con la stringa vuota (due doppi apici consecutivi): se alla richiesta di input della stringa da cercare si risponde premendo solamente il tasto Invio, viene acquisita una stringa contenente solo il carattere terminatore null. Ciò rende falsa la condizione e quindi il ciclo ha termine (strcmp in questo caso restituisce 0).
  • 23. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione trovata=0; /*5*/ La variabile trovata che viene azzerata nella riga 5 registrerà l’eventuale ritrovamento della stringa all’interno del vocabolario. Il valore assegnato non ha il senso di un valore numerico a tutti gli effetti ma il senso di un valore logico (0 = falso, un valore non nullo=vero). Una variabile usata in questo modo viene chiamata solitamente variabile logica, switch o flag.
  • 24. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione if (!strcmp(parcerc,vocab[i])) { /*6*/ Nella 6 si confronta la parola da cercare via via con le parole contenute nel vocabolario. L’equivalenza delle due stringhe, quella da cercare e la parola del vocabolario esaminata, rende vera la condizione.
  • 25. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione trovata=1; /*7*/ break; /*8*/ In questo caso, riga 7, si rende vera la variabile trovata assegnandole un valore non nullo e con la break della riga 8 si forza l’uscita dal ciclo poiché è inutile continuare a confrontare la parola cercata con il resto delle parole del vocabolario: la ricerca viene sospesa.
  • 26. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione if (trovata) /*9*/ Nella riga 9 si esegue un test sul flag trovata: se è vero (cioè è stata eseguita l’istruzione della riga 7) la parola è stata trovata, se è falso (è rimasto inalterato il valore assegnato nella istruzione della riga 5) la ricerca ha avuto esito negativo.
  • 27. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Le stringhe e i puntatori Un metodo comunemente utilizzato per dichiarare e manipolare stringhe nei programmi è offerto dai puntatori. Come si vede nel programma dell'esempio seguente, che visualizza "Ciao Ciao" e porta a capo il cursore.
  • 28. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Esempio #include <stdio.h> char *string = "Ciao"; void main(void) { printf(string); printf(" %s n",string); }
  • 29. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione char *string = "Ciao"; La dichiarazione di string può apparire, a prima vista, anomala. Si tratta infatti, a tutti gli effetti, della dichiarazione di un puntatore e la stranezza consiste nel fatto che a questo non è assegnato un indirizzo di memoria, come ci si potrebbe aspettare, bensì una costante stringa. Ma è proprio questo l'artificio che consente di gestire le stringhe con normali puntatori a carattere: il compilatore, in realtà, assegna a string, puntatore a 16 bit, l'indirizzo della costante "Ciao".
  • 30. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione Dunque la word occupata da string non contiene la parola "Ciao", ma i 16 bit che esprimono la parte offset del suo indirizzo. A sua volta, "Ciao" occupa 5 byte di memoria. Proprio 5, non si tratta di un errore di stampa: i 4 byte necessari a memorizzare i 4 caratteri che compongono la parola, più un byte, nel quale il compilatore memorizza il valore binario 0, detto terminatore di stringa o null terminator. In C, tutte le stringhe sono chiuse da un null terminator, ed occupano perciò un byte in più del numero di caratteri "stampabili" che le compongono.
  • 31. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione printf(string); La prima chiamata a printf() passa quale argomento proprio string: dunque la stringa parametro indispensabile di printf() non deve essere necessariamente una stringa di formato quando l'unica cosa da visualizzare sia proprio una stringa. Lo è, però, quando devono essere visualizzati caratteri o numeri, o stringhe formattate in un modo particolare, come avviene nella seconda chiamata. printf(" %s n",string);
  • 32. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Osservazioni Per visualizzare una stringa con printf() occore fornirne l'indirizzo, che nel nostro caso è il contenuto del puntatore string. Se string punta alla stringa "Ciao", che cosa restituisce l'espressione *string? La tentazione di rispondere "Ciao" è forte, ma se così fosse perché per visualizzare la parola occorre passare a printf() string e non *string?
  • 33. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Osservazioni Il problema non si poneva con gli esempi precedenti, perché tutti i puntatori esaminati indirizzavano un unico dato di un certo tipo. Con le dichiarazioni: float numero = 12.5; float *numPtr = &numero; si definisce il puntatore numPtr e lo si inizializza in modo che contenga l'indirizzo della variabile numero, la quale, in fondo proprio come string, occupa più di un byte. In questo caso, però, i 4 byte di numero contengono un dato unitariamente considerato.
  • 34. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Osservazioni In altre parole, nessuno dei 4 byte che la compongono ha significato in sé e per sé. Con riferimento a string, al contrario, ogni byte è un dato a sé stante, cioè un dato di tipo char: bisogna allora precisare che un puntatore indirizza sempre il primo byte di tutti quelli che compongono il tipo di dato considerato, se questi sono più d'uno. Se ne ricava che string contiene, in realtà, l'indirizzo del primo carattere di "Ciao", cioè la 'C'. Allora *string non può che restituire proprio quella, come si può facilmente verificare con la seguente chiamata a printf(): printf("%c è il primo carattere...n",*string);
  • 35. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Le stringhe come sequenze di caratteri Le stringhe sono, per il compilatore C, semplici sequenze di char: la stringa del nostro esempio: char *string = "Ciao"; inizia con il char che si trova all'indirizzo contenuto in string (la 'C') e termina con il primo byte nullo incontrato ad un indirizzo uguale o superiore a quello del primo carattere (nell’esempio il byte che segue immediatamente la 'o'). Per accedere ai caratteri che seguono il primo è sufficiente incrementare il puntatore o, comunque, sommare ad esso una opportuna quantità (che rappresenta l'offset, cioè lo spostamento, dall'inizio della stringa stessa).
  • 36. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Esempio int i = 0; while(*(string+i) != 0) { printf("%cn",*(string+i)); ++i; } L'esempio si basa sull'aritmetica dei puntatori, cioè sulla possibilità di accedere ai dati memorizzati ad un certo offset rispetto ad un indirizzo sommandovi algebricamente numeri interi.
  • 37. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione while(*(string+i) != 0) { printf("%cn",*(string+i)); ++i; } Il ciclo visualizza la stringa "Ciao" in senso verticale. Infatti l'istruzione while esegue le istruzioni comprese tra le parentesi graffe finché la condizione espressa tra le parentesi tonde è vera (se questa è falsa la prima volta, il ciclo non viene mai eseguito): in questo caso la printf() è eseguita finché il byte che si trova all'indirizzo contenuto in string aumentato di i unità è diverso da 0, cioè finché non viene incontrato il null terminator.
  • 38. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione printf("%cn",*(string+i)); La printf() visualizza il byte a quello stesso indirizzo e va a capo. Il valore di i è inizialmente 0, pertanto nella prima iterazione l'indirizzo espresso da string non è modificato, ma ad ogni loop i è incrementato di 1 (tale è il significato dell'operatore ++), pertanto ad ogni successiva iterazione l'espressione string+i restituisce l'indirizzo del byte successivo a quello appena visualizzato.
  • 39. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Descrizione Al termine, i contiene il valore 4, che è anche la lunghezza della stringa: questa è infatti convenzionalmente pari al numero dei caratteri stampabili che compongono la stringa stessa; il null terminator non viene considerato. int i = 0; while(*(string+i) != 0) { printf("%cn",*(string+i)); ++i; } In altre parole la lunghezza di una stringa è inferiore di 1 al numero di byte che essa occupa effettivamente in memoria.
  • 40. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Lunghezza di una stringa La lunghezza di una stringa può quindi essere calcolata così: unsigned i = 0; while(*(string+i)) ++i; La condizione tra parentesi è implicita: non viene specificato alcun confronto. In casi come questo il compilatore assume che il confronto vada effettuato con il valore 0, che è proprio quel che fa al nostro caso. Inoltre, dato che il ciclo si compone di una sola riga (l'autoincremento di i), le graffe non sono necessarie.
  • 41. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Osservazione Quando ad una funzione viene passata una costante stringa, come in: printf("Ciao!n"); il compilatore, astutamente, memorizza la costante e ne passa l'indirizzo.
  • 42. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Esempio: modifica di una stringa char *string = "Rosson"; Void main(void) { printf(string); *(string+3) = 'p'; printf(string); } Il programma dell'esempio visualizza dapprima la parola "Rosso" e poi "Rospo".
  • 43. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Osservazioni Il valore di string non è mutato: esso continua a puntare alla medesima locazione di memoria, ma è mutato il contenuto del byte che si trova ad un offset di 3 rispetto a quell'indirizzo. Dal momento che l'indirezione di un puntatore a carattere restituisce un carattere, nell'assegnazione della lettera 'p' è necessario esprimere quest'ultima come un char, e pertanto tra apici (e non tra virgolette). La variabile string non a casp è dichiarata all'esterno di main().
  • 44. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Come troncare una stringa Per troncare una stringa basta inserire un NULL dove occorre: *(string+2) = NULL; A questo punto una chiamata a printf() visualizzerebbe la parola "Ro". NULL è una costante manifesta definita in STDIO.H, e rappresenta lo zero binario; infatti la riga di codice precedente potrebbe essere scritta così: *(string+2) = 0;
  • 45. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Come allungare una stringa Se si sovrascrive il NULL con un carattere, la stringa si allunga sino al successivo NULL. Occorre fare alcune considerazioni:  in primo luogo, tale operazione ha senso, di solito, solo nel caso di concatenamento di stringhe (quando cioè si desidera accodare una stringa ad un'altra per produrne una sola, più lunga).  In secondo luogo, se i byte successivi al NULL sono occupati da altri dati, questi vengono perduti, sovrascritti dai caratteri concatenati alla stringa: l'effetto può essere disastroso.  Abbiamo visto che esiste una funzione di libreria concepita appositamente per concatenare le stringhe: la strcat(), che richiede due stringhe quali parametri. L'azione da essa svolta consiste nel copiare i byte che compongono la seconda stringa, NULL terminale compreso, in coda alla prima stringa, sovrascrivendone il NULL terminale.
  • 46. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” Osservazioni In una dichiarazione come quella di string, il compilatore riserva alla stringa lo spazio strettamente necessario a contenere i caratteri che la compongono, più il NULL. E' evidente che concatenare a string un'altra stringa sarebbe un grave errore (peraltro non segnalato dal compilatore, perché esso lascia il programmatore libero di gestire la memoria come crede: se sbaglia, peggio per lui).
  • 47. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” E' meglio sottolineare che le librerie standard del C comprendono un gran numero di funzioni (dichiarate in STRING.H) per la manipolazione delle stringhe, che effettuano le più svariate operazioni: copiare stringhe o parte di esse (strcpy(), strncpy()), concatenare stringhe (strcat(), strncat()), confrontare stringhe (strcmp(), stricmp()), ricercare sottostringhe o caratteri all'interno di stringhe (strstr(), strchr(), strtok())...
  • 48. Ing. Cristian Randieri – Lezioni di programmazione in C: ”Le stringhe” FINE