Gestion des erreurs
Comprendre la gestion des erreurs d'entrée
Une gestion robuste des erreurs est cruciale pour créer des programmes en C fiables. Sur les plateformes LabEx, la mise en œuvre de stratégies complètes de gestion des erreurs garantit des interactions fluides avec l'utilisateur et évite les terminaisons inattendues du programme.
Types d'erreurs d'entrée courantes
Type d'erreur |
Description |
Conséquences potentielles |
Dépassement de tampon (Buffer Overflow) |
Dépassement de la taille allouée du tampon |
Corruption de la mémoire |
Entrée invalide |
Type d'entrée non conforme |
Plantage du programme |
Gestion de la fin de fichier (EOF Handling) |
Fin inattendue de l'entrée |
Comportement indéfini |
Conversion de type |
Conversion numérique incorrecte |
Erreurs logiques |
Stratégies de gestion des erreurs
1. Technique de validation des entrées
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
int safe_integer_input() {
char buffer[100];
char *endptr;
long value;
while (1) {
printf("Enter an integer: ");
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
printf("Input error occurred.\n");
return -1;
}
errno = 0;
value = strtol(buffer, &endptr, 10);
// Check for conversion errors
if (endptr == buffer) {
printf("No valid input detected.\n");
continue;
}
// Check for overflow
if ((value == LONG_MAX || value == LONG_MIN) && errno == ERANGE) {
printf("Number out of range.\n");
continue;
}
// Check for extra characters
if (*endptr!= '\n' && *endptr!= '\0') {
printf("Invalid input. Extra characters detected.\n");
continue;
}
return (int)value;
}
}
int main() {
int result = safe_integer_input();
if (result!= -1) {
printf("Valid input: %d\n", result);
}
return 0;
}
Flux de gestion des erreurs
graph TD
A[Entrée utilisateur] --> B{Valider l'entrée}
B --> |Valide| C[Traiter l'entrée]
B --> |Invalide| D[Afficher un message d'erreur]
D --> E[Demander une nouvelle saisie]
E --> A
2. Approche de gestion des erreurs complète
#include <stdio.h>
#include <string.h>
enum InputError {
INPUT_SUCCESS,
INPUT_EMPTY,
INPUT_TOO_LONG,
INPUT_INVALID
};
enum InputError read_safe_string(char *buffer, size_t buffer_size) {
// Clear buffer
memset(buffer, 0, buffer_size);
// Read input
if (fgets(buffer, buffer_size, stdin) == NULL) {
return INPUT_EMPTY;
}
// Remove newline
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
buffer[len-1] = '\0';
len--;
}
// Check input length
if (len == 0) {
return INPUT_EMPTY;
}
if (len >= buffer_size - 1) {
return INPUT_TOO_LONG;
}
return INPUT_SUCCESS;
}
int main() {
char input[50];
enum InputError result;
while (1) {
printf("Enter a string: ");
result = read_safe_string(input, sizeof(input));
switch (result) {
case INPUT_SUCCESS:
printf("Valid input: %s\n", input);
return 0;
case INPUT_EMPTY:
printf("Error: Empty input\n");
break;
case INPUT_TOO_LONG:
printf("Error: Input too long\n");
break;
default:
printf("Unknown error\n");
}
}
}
Principes clés de gestion des erreurs
- Toujours valider l'entrée avant de la traiter
- Utiliser des codes d'erreur appropriés
- Fournir des messages d'erreur clairs
- Mettre en œuvre des mécanismes de nouvelle saisie
- Gérer les cas limites
- Utiliser des fonctions de conversion sécurisées
En mettant en œuvre ces techniques de gestion des erreurs, les développeurs peuvent créer des programmes en C plus robustes et fiables qui gèrent avec élégance les défis liés aux entrées utilisateur.