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