首頁 >後端開發 >C++ >如何在 C 中使用錯誤處理將字串轉換為整數?

如何在 C 中使用錯誤處理將字串轉換為整數?

DDD
DDD原創
2024-11-06 03:38:02843瀏覽

How to Convert Strings to Integers with Error Handling in C  ?

使用 C 語言中的錯誤處理將字串轉換為整數

在程式設計中,經常需要將字串轉換為整數。雖然 C 為此目的提供了 std::atoi 函數,但它不能優雅地處理轉換錯誤。為了解決這個問題,我們尋求允許錯誤處理的解決方案,類似 C# 的 Int32.TryParse。

Boost 的詞法轉換函數

一個有效的方法是使用 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

作為最後的替代方案,可以創建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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn