try catch不适用于std::stoull c++

dwbf0jvd  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(137)

std::stoull()不会对绝对错误的输入抛出任何异常。
出现此问题的代码示例:

#include <iostream>
#include <exception>
#include <string>
#include <sstream>

using namespace std;

int main() {
    stringstream ss("6yh45gu94j5vun:");
    string valueStr;
    if (!getline(ss, valueStr, ':')) {
        return -1;
    }
    unsigned long long value;
    try {
        value = stoull(valueStr, nullptr, 16);
    } catch (exception& e) {
        cout << -1;
        return -1;
    }
    cout << value;
}

我试图捕捉每一个异常,但仍然不起作用。
你能帮我吗?

gwo2fgha

gwo2fgha1#

函数std::stoull没有抛出异常,因为它成功地将输入转换为整数6。一旦遇到无法转换的字符,它将停止阅读。如果至少转换了一个字符,则认为转换成功。
如果要确定它转换了多少输入,则必须使用std::stoull的第二个参数,而不是将其设置为nullptr
为了使用第二个参数,必须定义一个附加变量

std::size_t num_chars_converted;

然后这样调用函数:

value = std::stoull(valueStr, &num_chars_converted, 16);

如果没有抛出异常,则变量num_chars_converted将包含转换的字符数。然后,您可以将该值与字符串的长度进行比较,以确定是否转换了整个字符串。

相关问题