首页 >后端开发 >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