Utilisation appropriée de strtol avec gestion des erreurs
Le programme C ou C suivant convertit les chaînes en entiers longs, en s'appuyant sur le fait que strtol renvoie NULL pour les conversions réussies. Cependant, lorsqu'on lui donne la valeur 55, il échoue avec le message suivant :
./convertToLong 55 Could not convert 55 to long and leftover string is: 55 as long is 55
Cet article explique comment détecter correctement les erreurs dans strtol et résoudre le problème dans le programme donné.
Gestion des erreurs dans strtol
La spécification officielle pour strtol (et les fonctions associées comme strtol) indique que :
Correction du programme
En C, les erreurs de strtol peuvent être détectées en définissant errno sur zéro avant d'appeler la fonction. La fonction parseLong modifiée ci-dessous suit cette approche :
static long parseLong(const char *str) { errno = 0; char *temp; long val = strtol(str, &temp, 0); if (temp == str || *temp != '<pre class="brush:php;toolbar:false">bool parseLong(const char *str, long *val) { char *temp; bool rc = true; errno = 0; *val = strtol(str, &temp, 0); if (temp == str || *temp != '' || ((*val == LONG_MIN || *val == LONG_MAX) && errno == ERANGE)) rc = false; return rc; }
En C , une approche plus flexible consiste à renvoyer un indicateur de réussite/échec et à fournir une fonction distincte pour extraire la valeur convertie :
Conclusion
Avec ces modifications, la fonction parseLong gère correctement les erreurs de strtol, permettant aux applications de déterminer le succès ou l'échec des conversions et gérer les erreurs de manière appropriée.
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!