Maison >développement back-end >C++ >Comment puis-je utiliser correctement strtol pour convertir des chaînes en entiers longs et gérer les erreurs potentielles ?

Comment puis-je utiliser correctement strtol pour convertir des chaînes en entiers longs et gérer les erreurs potentielles ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-25 17:31:14801parcourir

How Can I Correctly Use strtol to Convert Strings to Long Integers and Handle Potential Errors?

Utilisation correcte de strtol

La fonction strtol convertit une représentation sous forme de chaîne d'un entier long en une valeur longue. Cependant, il est essentiel de comprendre comment gérer correctement les erreurs lors de l'utilisation de cette fonction.

Dans le code donné, le problème survient en raison d'une hypothèse incorrecte. Le code repose sur le fait que si strtol réussit à convertir la chaîne, le deuxième paramètre doit être égal à NULL. Cependant, cette hypothèse n'est pas toujours vraie.

Pour détecter efficacement les erreurs de strtol, il est nécessaire de suivre les directives appropriées de gestion des erreurs :

  • Définissez errno sur 0 avant d'appeler strtol : Les fonctions de bibliothèque standard ne définissent pas errno sur 0, il doit donc être manuellement défini sur zéro avant chaque strtol call.
  • Vérifiez temp par rapport à str et *temp != ' ': La condition d'erreur se produit lorsque la séquence d'objet est vide ou n'a pas la forme attendue. Ceci est indiqué par temp == str ou tout caractère non reconnu après la séquence d'objet, qui est vérifiée par *temp != ' '.
  • Gérer la valeur en dehors de la plage représentable : Si la valeur convertie est en dehors de la plage représentable d'un long, strtol renvoie LONG_MIN, LONG_MAX ou définit errno sur ERANGE. Cela doit être vérifié pour garantir une gestion correcte de ces erreurs.

Voici une version révisée de la fonction parseLong qui adhère à ces principes :

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)
{
    errno = 0;
    char *temp;
    *val = strtol(str, &temp, 0);

    if (temp == str || *temp != '' ||
        ((*val == LONG_MIN || *val == LONG_MAX) &amp;&amp; errno == ERANGE)) {
        return false;
    }

    return true;
}
' || ((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; // or LONG_MIN/LONG_MAX if needed } return val; }

Alternativement, pour séparer la gestion des erreurs à partir du résultat de la conversion, une interface modifiée peut être utilisé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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn