"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como converter strings em inteiros com tratamento de erros em C++?

Como converter strings em inteiros com tratamento de erros em C++?

Publicado em 2024-11-14
Navegar:401

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

Convertendo strings em inteiros com tratamento de erros em C

Na programação, muitas vezes é necessário converter strings em inteiros. Embora C forneça a função std::atoi para essa finalidade, ela não lida com erros de conversão normalmente. Para resolver isso, buscamos uma solução que permita o tratamento de erros, semelhante ao Int32.TryParse do C#.

Função Lexical Cast do Boost

Uma abordagem eficiente é usar a função lexical_cast da biblioteca Boost . Ele oferece suporte a uma variedade de tipos de dados e pode lançar uma exceção se a conversão falhar. Aqui está um exemplo:

#include 

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

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

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

Usando funções de biblioteca padrão

Se Boost não estiver disponível, uma combinação de std::stringstream e operador >> pode ser usada:

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

Falsificando o Lexical Cast do Boost

Como alternativa final, uma versão "falsa" da função lexical_cast do Boost pode ser criada:

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

Versões sem lançamento

Se uma versão sem lançamento for desejada, capture as exceções apropriadas e retorne um booleano indicando sucesso ou falha:

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 
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3