Maison > développement back-end > C++ > Comment puis-je détecter de manière fiable les erreurs lors de la conversion de chaînes en entiers longs à l'aide de strtol en C ?

Comment puis-je détecter de manière fiable les erreurs lors de la conversion de chaînes en entiers longs à l'aide de strtol en C ?

Linda Hamilton
Libérer: 2024-12-14 20:36:16
original
562 Les gens l'ont consulté

How Can I Reliably Detect Errors When Converting Strings to Long Integers Using strtol in C?

Détection des erreurs dans la conversion de chaîne en long à l'aide de strtol

En programmation C, la fonction strtol est couramment utilisée pour convertir une représentation sous forme de chaîne d'un entier long à sa valeur numérique. Cependant, l'utilisation de strtol seul ne fournit pas toujours une gestion suffisante des erreurs.

Problème :

Le code fourni illustre un scénario dans lequel le programme convertit correctement une chaîne en un entier long. , mais imprime également un message d'erreur indiquant "Impossible de convertir" malgré une conversion réussie. En effet, le programme suppose que si strtol convertit avec succès la chaîne, le deuxième paramètre (indiquant une chaîne restante) doit être NULL. Cependant, certaines conditions peuvent conduire à des chaînes restantes non NULL même avec une conversion réussie.

Solution :

Pour détecter avec précision les erreurs de strtol, envisagez les améliorations suivantes :

  1. Utilisez une fonction dédiée pour invoquer strtol : Cela améliore l'organisation du code et lisibilité.
  2. Vérifiez plusieurs conditions d'erreur : la gestion des erreurs strtol est complexe. En plus des restes, vous devez également vérifier les chaînes numériques non valides, les débordements numériques et les espaces de début/fin.
  3. Définissez explicitement errno sur 0 avant d'appeler strtol : Cela garantit que errno est correctement défini pour indiquer les erreurs rencontrées.
  4. Vérifiez les valeurs d'erreur spécifiques : En cas d'erreur, vérifiez pour la valeur errno associée à ERANGE (débordement numérique).

Fonction révisée :

bool parseLong(const char *str, long *val)
{
    char *temp;
    bool rc = true;
    errno = 0;
    *val = strtol(str, &temp, 0);

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">if (parseLong(str, &value))
    // Conversion successful
else
    // Handle error
Copier après la connexion
' || ((*val == LONG_MIN || *val == LONG_MAX) && errno == ERANGE)) rc = false; return rc; }

Utilisation :

Cette fonction révisée renvoie un booléen pour indiquer si la conversion a réussi ou non. Vous pouvez l'utiliser comme suit :

Remarques supplémentaires :

  • Vous pouvez personnaliser davantage la fonction pour gérer la réduction des espaces blancs ou restreindre la conversion à valeurs décimales uniquement.
  • Dans certains scénarios, vous aurez peut-être besoin d'un mécanisme de rapport d'erreurs plus granulaire, comme renvoyer un code d'erreur ou lancer un exception.

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