Maison >développement back-end >C++ >Comment convertir des chaînes en entiers avec gestion des erreurs en C ?

Comment convertir des chaînes en entiers avec gestion des erreurs en C ?

DDD
DDDoriginal
2024-11-06 03:38:02860parcourir

How to Convert Strings to Integers with Error Handling in C  ?

Conversion de chaînes en entiers avec gestion des erreurs en C

En programmation, il est souvent nécessaire de convertir des chaînes en entiers. Bien que C fournisse la fonction std::atoi à cet effet, il ne gère pas correctement les erreurs de conversion. Pour résoudre ce problème, nous recherchons une solution qui permette la gestion des erreurs, similaire à Int32.TryParse de C#.

Fonction Lexical Cast de Boost

Une approche efficace consiste à utiliser la fonction lexical_cast de la bibliothèque Boost . Il prend en charge une variété de types de données et peut lever une exception si la conversion échoue. Voici un exemple :

<code class="cpp">#include <boost/lexical_cast.hpp>

int main() {
    std::string s;
    std::cin >> s;

    try {
        int i = boost::lexical_cast<int>(s);

        // ...
    } catch (...) {
        // Handle error
    }
}</code>

Utilisation des fonctions de bibliothèque standard

Si Boost n'est pas disponible, une combinaison de std::stringstream et >> L'opérateur peut être utilisé :

<code class="cpp">#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string s;
    std::cin >> s;

    try {
        std::stringstream ss(s);

        int i;
        if ((ss >> i).fail() || !(ss >> std::ws).eof()) {
            throw std::bad_cast();
        }

        // ...
    } catch (...) {
        // Handle error
    }
}</code>

Faking Lexical Cast de Boost

Comme dernière alternative, une version "fausse" de la fonction lexical_cast de Boost peut être créée :

<code class="cpp">#include <iostream>
#include <sstream>
#include <string>

template <typename T>
T lexical_cast(const std::string& s) {
    std::stringstream ss(s);

    T result;
    if ((ss >> result).fail() || !(ss >> std::ws).eof()) {
        throw std::bad_cast();
    }

    return result;
}

int main() {
    std::string s;
    std::cin >> s;

    try {
        int i = lexical_cast<int>(s);

        // ...
    } catch (...) {
        // Handle error
    }
}</code>

Versions sans lancement

Si une version sans lancement est souhaitée, interceptez les exceptions appropriées et renvoyez un booléen indiquant le succès ou l'échec :

<code class="cpp">template <typename T>
bool lexical_cast(const std::string& s, T& t) {
    try {
        t = lexical_cast<T>(s);
        return true;
    } catch (const std::bad_cast& e) {
        return false;
    }
}

int main() {
    std::string s;
    std::cin >> s;

    int i;
    if (!lexical_cast(s, i)) {
        std::cout << "Bad cast." << std::endl;
    }
}</code>

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