Maison > développement back-end > C++ > Comment puis-je gérer correctement les erreurs lors de l'utilisation de strtol en C et C ?

Comment puis-je gérer correctement les erreurs lors de l'utilisation de strtol en C et C ?

Barbara Streisand
Libérer: 2024-12-25 15:35:09
original
861 Les gens l'ont consulté

How Can I Properly Handle Errors When Using strtol in C and C  ?

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
Copier après la connexion

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 :

  • Il divise la chaîne d'entrée en trois parties : les espaces, le sujet (entier) et les caractères non reconnus.
  • Si le sujet est vide ou invalide, aucune conversion n'a lieu et endptr pointe vers le début de la chaîne d'entrée.
  • Si la valeur convertie est en dehors de la plage représentable, elle renvoie la valeur minimale ou maximale appropriée (par exemple, LONG_MIN ou LONG_MAX), et errno est défini sur ERANGE.

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, &amp;temp, 0);

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

    return rc;
}
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); // cerr << "Could not convert '" << str << "' to long and leftover string is '" // << temp << "'\n"; return val; }
  • Si l'entrée est vide, invalide ou comporte des caractères de fin, elle imprime une erreur sur stderr et renvoie 0 ou LONG_MIN/LONG_MAX si l'erreur était dû à un dépassement de plage.
  • S'il n'y a eu aucune erreur, il renvoie le converti valeur.

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!

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