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