C++ std::stoi版本拒绝任何非数字
您可能知道,C++ std::stoi版本拒绝任何非数字,c++,C++,您可能知道,std::sto*函数族的工作方式是读取字符串中的数字,直到找到非数字,如下所示: std::string pseudoNum = "123haha"; int num = std::stoi(pseudoNum); //no problem, num = 123 是否有更严格的整数解析的标准方法,在这种情况下(当字符串不是完全整数时)会导致异常/错误代码返回?您可以使用C++17并检查解析值的长度: #包括 #包括 int main(){ const std::string st
std::sto*
函数族的工作方式是读取字符串中的数字,直到找到非数字,如下所示:
std::string pseudoNum = "123haha";
int num = std::stoi(pseudoNum); //no problem, num = 123
是否有更严格的整数解析的标准方法,在这种情况下(当字符串不是完全整数时)会导致异常/错误代码返回?您可以使用C++17并检查解析值的长度:
#包括
#包括
int main(){
const std::string str{“123haha”};
int值=0;
const auto result=std::from_chars(str.data(),
str.data()+str.size(),
价值);
如果(result.ec==std::errc()){
第二个参数不适合你吗?
std::stoi的第二个参数非常有用:如果返回的位置等于字符串的大小,那么整个字符串就是一个数字。std::sto*()
方法的第二个参数是std::size\u t*pos
,它将设置为用于转换的数字字符数(可以看到)
我就是这样实现的:
int my_stoi(const std::string & str)
{
std::string::size_type pos;
const int value = std::stoi(str, /* out */ &pos);
if (pos != str.size())
{
std::cerr << "Failed parsing string '" << str << "' as an integer" << std::endl;
}
return value;
}
int my_stoi(const std::string&str)
{
std::string::size\u type pos;
const int value=std::stoi(str,/*out*/&pos);
如果(位置=str.size())
{
我认为没有标准的。我通常在std::strtol
@HolyBlackCat的基础上编写我自己的函数,如果你能给出答案,它仍然是一个好的:)你当然可以检查std::string(num)==pseudoNum
“0123”
。虽然我很喜欢这个答案,但我还没有C++17:(@bartop)我也会尝试编写答案的C++11部分