Dans le programme C donné, l'utilisation de strtol semble utiliser le le fait que les conversions réussies de chaîne en chaîne longue doivent laisser le deuxième paramètre (endptr) égal à NULL pour déterminer les erreurs. Cependant, le message d'erreur affiché suggère que ce n'est pas toujours le cas.
L'approche correcte de la détection des erreurs dans strtol implique plusieurs étapes :
1. Définissez errno sur 0 : Les fonctions de la bibliothèque C standard ne définissent pas errno sur 0, donc le faire manuellement avant d'appeler strtol garantit que toutes les erreurs rencontrées seront reflétées dans errno.
2. Vérifiez les résultats de conversion : Si strtol renvoie 0 ou LONG_MIN/LONG_MAX avec errno défini sur ERANGE, cela indique une erreur de conversion ou une valeur hors plage.
3. Distinguer les types d'erreur : Dans certains cas, vous devrez peut-être faire la différence entre des types d'erreur spécifiques, tels que des fichiers indésirables de fin ou des formats numériques non valides. Ceci peut être réalisé en vérifiant la position de endptr et la valeur d'erreur dans errno.
Voici une version révisée de la fonction parseLong :
static long parseLong(const char *str) { char *temp; errno = 0; // Reset errno long val = strtol(str, &temp, 0); if (temp == str || *temp != '' || ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) { fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n", str, temp); return 0; // Handle errors by returning a specific value like 0 } return val; }
Cette fonction renvoie 0 en cas d'erreur, tout en renvoyant la valeur convertie si réussi.
Le principal point à retenir de cette analyse des erreurs est d'utiliser une approche complète de gestion des erreurs qui implique la définition du numéro d'erreur, la vérification des résultats de conversion et la distinction des types d'erreur. Cela garantit un code robuste et fiable lorsque vous travaillez avec des conversions de chaîne en numérique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!