在程式設計中,經常需要將字串轉換為整數。雖然 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中文網其他相關文章!