プログラミングでは、多くの場合、文字列を整数に変換する必要があります。 C ではこの目的のために std::atoi 関数が提供されていますが、変換エラーは適切に処理されません。これに対処するために、C# の Int32.TryParse と同様のエラー処理を可能にするソリューションを模索します。
効率的なアプローチは、Boost ライブラリの lexical_cast 関数を使用することです。 。さまざまなデータ型をサポートしており、キャストが失敗した場合は例外をスローできます。以下に例を示します。
<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>
Boost が利用できない場合は、std::stringstream と >> の組み合わせが使用されます。演算子を使用できます:
<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>
最後の代替として、Boost の lexical_cast 関数の「偽」バージョンを作成できます:
<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>
スローなしバージョンが必要な場合は、適切な例外をキャッチし、成功または失敗を示すブール値を返します:
<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>
以上がC のエラー処理を使用して文字列を整数に変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。