Esercizi Gestione Errori in C
- Esercizio 1: Apertura di un File
- Esercizio 2: Allocazione di Memoria Dinamica
- Esercizio 3: Divisione per Zero
- Esercizio 4: Accesso a un Elemento di un Array fuori dai Limiti
- Esercizio 5: Conversione di una Stringa in Numero
- Esercizio 6: Lettura di un File Binario
- Esercizio 7: Apertura di un Socket
- Esercizio 8: Chiusura di un File
Ecco degli esercizi semplici con soluzione per praticare la gestione degli errori in C.
Esercizio 1: Apertura di un File
Gestire l'errore durante l'apertura di un file.
#include <stdio.h>
int main() { FILE *file = fopen("testo.txt", "r"); if (file == NULL) { perror("Errore nell'apertura del file"); return 1; } fclose(file); return 0;}
Esercizio 2: Allocazione di Memoria Dinamica
Gestire l'errore durante l'allocazione di memoria dinamica.
#include <stdio.h>#include <stdlib.h>
int main() { int *ptr = (int *)malloc(sizeof(int) * 10); if (ptr == NULL) { perror("Errore di allocazione della memoria"); return 1; } free(ptr); return 0;}
Esercizio 3: Divisione per Zero
Gestire l'errore di divisione per zero.
#include <stdio.h>
int main() { int a = 10, b = 0; if (b == 0) { fprintf(stderr, "Errore: divisione per zero\n"); return 1; } int risultato = a / b; printf("Risultato: %d\n", risultato); return 0;}
Esercizio 4: Accesso a un Elemento di un Array fuori dai Limiti
Gestire l'errore di accesso a un elemento di un array fuori dai limiti.
#include <stdio.h>
int main() { int arr[5] = {1, 2, 3, 4, 5}; int indice = 10; if (indice < 0 || indice >= 5) { fprintf(stderr, "Errore: indice fuori dai limiti\n"); return 1; } printf("Elemento: %d\n", arr[indice]); return 0;}
Esercizio 5: Conversione di una Stringa in Numero
Gestire l'errore durante la conversione di una stringa in numero.
#include <stdio.h>#include <stdlib.h>
int main() { char *str = "123abc"; char *endptr; long val = strtol(str, &endptr, 10);
if (*endptr != '\0') { fprintf(stderr, "Errore: conversione non riuscita, carattere non numerico trovato: %c\n", *endptr); return 1; }
printf("Numero convertito: %ld\n", val); return 0;}
Esercizio 6: Lettura di un File Binario
Gestire l'errore durante la lettura di un file binario.
#include <stdio.h>
typedef struct { int id; char nome[50];} Record;
int main() { FILE *file = fopen("dati.bin", "rb"); if (file == NULL) { perror("Errore nell'apertura del file"); return 1; }
Record rec; size_t result = fread(&rec, sizeof(Record), 1, file); if (result != 1) { if (feof(file)) { fprintf(stderr, "Errore: fine del file raggiunta inaspettatamente\n"); } else { perror("Errore nella lettura del file"); } fclose(file); return 1; }
printf("ID: %d, Nome: %s\n", rec.id, rec.nome); fclose(file); return 0;}
Esercizio 7: Apertura di un Socket
Gestire l'errore durante l'apertura di un socket.
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <arpa/inet.h>#include <unistd.h>
int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("Errore nell'apertura del socket"); return 1; }
struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) { perror("Errore nella conversione dell'indirizzo IP"); close(sockfd); return 1; }
if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("Errore nella connessione al server"); close(sockfd); return 1; }
printf("Connessione riuscita\n"); close(sockfd); return 0;}
Esercizio 8: Chiusura di un File
Gestire l'errore durante la chiusura di un file.
#include <stdio.h>
int main() { FILE *file = fopen("testo.txt", "r"); if (file == NULL) { perror("Errore nell'apertura del file"); return 1; }
if (fclose(file) != 0) { perror("Errore nella chiusura del file"); return 1; }
printf("File chiuso correttamente\n"); return 0;}