Ritorna alla pagina del corso.

Questa pagina contiene gli esercizi proposti in laboratorio e -alcune- delle soluzioni proposte.
Si suggerisce di provare a risolvere gli esercizi e solo in un secondo tempo di confrontare quanto fatto con le soluzioni proposte.

01: /*
02: 5. modifichi la seguente funzione di modo da correggere l'errore di "lingering pointer" presente:
03:    char *read_line(void){
04:     char tmp[2000];
05:     scanf("%[^\n]", tmp);
06:     return tmp;
07:    }
08: */
09: 
10: #include<stdio.h>
11: #include<stdlib.h>
12: #include<string.h>
13: 
14: /* funzione che non "funziona"
15: char *read_line(void)
16: {
17:   char tmp[2000];
18:   scanf("%[^\n]", tmp);
19:   return tmp;  // restituisco un indirizzo valido ma tmp[] viene distrutta al termine della funzione
20: }
21: 
22: 5.c:18:10: warning: function returns address of local variable [-Wreturn-local-addr]
23:    18 |   return tmp;
24:       |          ^~~
25: */
26: 
27: /* banale trasposizione della precedente usando allocazione dinamica di array comunque largo
28: char *read_line(void)
29: {
30:   char *tmp = malloc(2000*sizeof(char));
31:   scanf("%[^\n]", tmp);
32:   return tmp;  
33: }
34: */
35: 
36: /* alloco dinamicamente con malloc() ma poi riduco dimensione buffer con realloc() una volta che so quanti caratteri ho letto
37: char *read_line(void)
38: {
39:   char *tmp = malloc(2000*sizeof(char));
40:   scanf("%[^\n]", tmp);
41:   tmp = realloc(tmp, (strlen(tmp)+1)*sizeof(char)); // +1 in quanto ci vuole lo spazio per il carattere nullo di terminaziono
42:   return tmp;  
43: }
44: */
45: 
46: char *read_line(void)
47: {
48:   char tmp[2000];
49:   scanf("%[^\n]", tmp);
50:   char *s = malloc((strlen(tmp) + 1) * sizeof(char));
51:   strcpy(s, tmp);
52:   return s;  
53: }
54: 
55: int main(int argc, char **argv){
56: 
57:   printf("Inserisci una stringa: ");
58:   char *s = read_line();
59:   printf("Bravo, hai inserito %s\n", s);
60: 
61:   return 0;
62: }
63: 
64: