温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - Version of std::stoi rejecting any non-number
c++

c++ - std :: stoi的版本拒绝任何非数字

发布于 2020-03-28 23:34:18

您可能知道,std::sto*函数族的工作方式是读取字符串中的数字,直到找到非数字为止,如下所示:

std::string pseudoNum = "123haha";
int num = std::stoi(pseudoNum); //no problem, num = 123

有什么标准的方法可以进行更严格的整数分析,从而在这种情况下(当字符串不是完全整数时)导致返回异常/错误代码?

查看更多

查看更多

提问者
bartop
被浏览
24
NutCracker 2020-01-31 18:22

您可以使用C ++ 17 std::from_chars并检查解析值的长度:

#include <iostream>
#include <charconv>

int main() {
    const std::string str { "123haha" };
    int value = 0;
    const auto result = std::from_chars(str.data(), 
                                        str.data() + str.size(), 
                                        value);

    if (result.ec == std::errc()) {
        std::cout << "Value: " << value << std::endl;
        std::cout << "Length: " << result.ptr - str.data() << std::endl;
    }

    return 0;
}

现场查看

C ++ 11解决方案

的第二个参数std::stoi是整数的地址,用于存储处理的字符数。

#include <iostream>

int main() {
    const std::string str { "123haha" };
    std::size_t processed_chars = 0;
    int value = std::stoi(str, &processed_chars);

    std::cout << "Value: " << value << std::endl;
    std::cout << "Length: " << processed_chars << std::endl;

    return 0;
}

现场查看