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