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
Libérer: 2024-11-06 03:38:02
original
882 Les gens l'ont consulté

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

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

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

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

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 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal