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: