"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo convertir cadenas a números enteros con manejo de errores en C++?

¿Cómo convertir cadenas a números enteros con manejo de errores en C++?

Publicado el 2024-11-14
Navegar:919

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

Conversión de cadenas a números enteros con manejo de errores en C

En programación, a menudo es necesario convertir cadenas a números enteros. Si bien C proporciona la función std::atoi para este propósito, no maneja correctamente los errores de conversión. Para solucionar esto, buscamos una solución que permita el manejo de errores, similar a Int32.TryParse de C#.

Función Lexical Cast de Boost

Un enfoque eficiente es utilizar la función lexical_cast de la biblioteca Boost . Admite una variedad de tipos de datos y puede generar una excepción si falla la conversión. Aquí hay un ejemplo:

#include 

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

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

        // ...
    } catch (...) {
        // Handle error
    }
}

Uso de funciones de biblioteca estándar

Si Boost no está disponible, se puede usar una combinación de std::stringstream y >> operador:

#include 
#include 
#include 

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
    }
}

Falsificación del reparto léxico de Boost

Como alternativa final, se puede crear una versión "falsa" de la función lexical_cast de Boost:

#include 
#include 
#include 

template 
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(s);

        // ...
    } catch (...) {
        // Handle error
    }
}

Versiones sin lanzamiento

Si se desea una versión sin lanzamiento, capture las excepciones apropiadas y devuelva un valor booleano que indique éxito o fracaso:

template 
bool lexical_cast(const std::string& s, T& t) {
    try {
        t = lexical_cast(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 
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3