01: // array di stringhe mediante array di puntatori ottenuto con puntatori a puntatori
02: #include<stdio.h>
03: #include<stdlib.h>
04: 
05: #include<string.h>
06: 
07: int main(int argc, char **argv){
08: 
09:   char incipit[] = 
10: "Nel mezzo del cammin di nostra vita   \
11: mi ritrovai per una selva oscura:      \
12: che la diritta via era smarrita.       \
13: E quanto a dir qual era e cosa dura    \
14: esta selva selvaggia et aspra e forte, \
15: che nel pensier rinova la paura!";
16:   char delimitatori[]= " :.,;'!+-";
17:   char *word;
18: 
19: 
20:   // un array di puntatori puo' essere usato per memorizzare tante stringhe
21:   // devo:
22:   // 1. dimensionare il numero massimo di stringhe da gestire
23: 
24:   char **str_array=NULL; // equivalente all'array visto in precedenza ma in questo caso non ho limiti neanche sul numero di stringhe
25:   // devo inizializzarlo a NULL visto che useremo la realloc()
26:   int mem_used=sizeof(str_array);
27: 
28:   int i;
29:   word = strtok(incipit, delimitatori);
30:   for(i=0; word; ++i) // mi fermo se finisco con strtok ma non prevedo un massimo numero di stringhe
31:   {
32:     //  per aggiungere la parola letta all'array prima di tutto devo creare una riga e poi allocare la stessa,
33:     //  quindi un passaggio in piu' rispetto al precedente
34:     str_array = realloc(str_array, sizeof(char*) * (i + 1));  // realloc() mi permette di aggiornare il numero di righe. Mi servono i+1 righe visto che qui ho gia' letto i+1 parole
35:     str_array[i] = malloc(sizeof(char) * (strlen(word) + 1)); // come precedente, alloco spazio necessario in base a quanto devo memorizzare
36:     strcpy(str_array[i], word); // man mano che ho una parola la ricopio nella posizione giusta nell'array
37:     mem_used += sizeof(char) * (strlen(word) + 1) + sizeof(char*); // molto piu' flessibile ma leggera penalizzazione in termini di memoria
38: 
39:     word = strtok(NULL, delimitatori);
40:   }
41: 
42:   for(int j=0; j<i; ++j)
43:   { 
44:     printf("#%d \t %s\n", j, str_array[j]);
45:     free(str_array[j]); // libero memoria visto che non la uso piu'
46:   }
47:   free(str_array);
48: 
49:   printf("Per memorizzare le stringhe ho usato %d byte di memoria\n", mem_used);
50: 
51:   return 0;
52: }
53: 
54: 


Se avete commenti o osservaƶioni su questa pagina
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it