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
Libérer: 2024-12-25 17:31:14
original
778 Les gens l'ont consulté

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;
}
Copier après la connexion
' || ((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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal