31.05.2013 Views

Tricky C - Si® @lbert Site

Tricky C - Si® @lbert Site

Tricky C - Si® @lbert Site

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

28 - <strong>Tricky</strong> C<br />

A questo punto una chiamata a printf() visualizzerebbe la parola "Ro". NULL è una<br />

costante manifesta (vedere pag. 44) definita in STDIO.H, e rappresenta lo zero binario; infatti la riga di<br />

codice precedente potrebbe essere scritta così:<br />

*(string+2) = 0;<br />

E' possibile allungare una stringa? Sì, basta... essere sicuri di avere spazio a disposizione. Se si<br />

sovrascrive il NULL con un carattere, la stringa si allunga sino al successivo NULL. Occorre fare alcune<br />

considerazioni: in primo luogo, tale operazione ha senso, di solito, solo nel caso di concatenamento di<br />

stringhe (quando cioè si desidera accodare una stringa ad un'altra per produrne una sola, più lunga). In<br />

secondo luogo, se i byte successivi al NULL sono occupati da altri dati, questi vengono perduti,<br />

sovrascritti dai caratteri concatenati alla stringa: l'effetto può essere disastroso. In effetti esiste una<br />

funzione di libreria concepita appositamente per concatenare le stringhe: la strcat(), che richiede due<br />

stringhe quali parametri. L'azione da essa svolta consiste nel copiare i byte che compongono la seconda<br />

stringa, NULL terminale compreso, in coda alla prima stringa, sovrascrivendone il NULL terminale.<br />

In una dichiarazione come quella di string, il compilatore riserva alla stringa lo spazio<br />

strettamente necessario a contenere i caratteri che la compongono, più il NULL. E' evidente che<br />

concatenare a string un'altra stringa sarebbe un grave errore (peraltro non segnalato dal compilatore,<br />

perché esso lascia il programmatore libero di gestire la memoria come crede: se sbaglia, peggio per lui).<br />

Allora, per potere concatenare due stringhe senza pericoli occorre riservare in anticipo lo spazio<br />

necessario a contenere la prima stringa e la seconda... una in fila all'altra. Affronteremo il problema<br />

parlando di array (pag. 29) e di allocazione dinamica della memoria (pag. 109).<br />

Avvertenza: una dichiarazione del tipo:<br />

char *sPtr;<br />

riserva in memoria lo spazio sufficiente a memorizzare il puntatore alla stringa, e non una (ipotetica)<br />

stringa. I byte allocati sono 2 se il puntatore è, come nell'esempio, near; mentre sono 4 se è far o<br />

huge. In ogni caso va ricordato che prima di copiare una stringa a quell'indirizzo bisogna assolutamente<br />

allocare lo spazio necessario a contenerla e assegnarne l'indirizzo a sPtr. Anche a questo proposito<br />

occorre rimandare gli approfondimenti alle pagine in cui esamineremo l'allocazione dinamica della<br />

memoria (pag. 109).<br />

E' meglio sottolineare che le librerie standard del C comprendono un gran numero di funzioni<br />

(dichiarate in STRING.H) per la manipolazione delle stringhe, che effettuano le più svariate operazioni:<br />

copiare stringhe o parte di esse (strcpy(), strncpy()), concatenare stringhe (strcat(),<br />

strncat()), confrontare stringhe (strcmp(), stricmp()), ricercare sottostringhe o caratteri<br />

all'interno di stringhe (strstr(), strchr(), strtok())... insomma, quando si deve trafficare con<br />

le stringhe vale la pena di consultare il manuale delle librerie e cercare tra le funzioni il cui nome inizia<br />

con "str": forse la soluzione al problema è già pronta.<br />

G l i a r r a y<br />

Un array (o vettore) è una sequenza di dati dello stesso tipo, sistemati in memoria... in fila<br />

indiana. Una stringa è, per definizione, un array di char. Si possono dichiarare array di int, di<br />

double, o di qualsiasi altro tipo. Il risultato è, in pratica, riservare in memoria lo spazio necessario a<br />

contenere un certo numero di variabili di quel tipo. In effetti, si può pensare ad un array anche come ad un<br />

gruppo di variabili, aventi tutte identico nome ed accessibili, quindi, referenziandole attraverso un indice.<br />

Il numero di "variabili" componenti l'array è indicato nella dichiarazione:<br />

int iArr[15];

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!