使用stod()将小数点后的字母转换为字符串时,也不例外

时间:2018-09-06 22:59:57

标签: c++

#include<iostream>
#include<string>
using namespace std;

int main()
{
    double var;
    string word("20.njhggh");
    var = stod(word);
    cout << var << endl;
    return 0;
}

输出为:20

stod函数不会引发输入"20.njhggh"的异常。它只是忽略小数点后的字母。 对于上述情况,我如何提出例外情况

2 个答案:

答案 0 :(得分:3)

  

对于上述情况,我如何提出例外情况

根据文档,stod有第二个参数:

double      stod( const std::string& str, std::size_t* pos = 0 );
     

如果pos不是空指针,则转换函数内部的指针ptr将接收str.c_str()中第一个未转换字符的地址,并将计算该字符的索引并将其存储在* pos,给出了转换处理的字符数。

因此,如果要在某些字符串未用于转换时引发异常,则可以将*pos与字符串的大小进行比较:

std::size_t pos;
var = stod(word, &pos);
if (pos < word.size())
    throw some_exception();

答案 1 :(得分:1)

stod调用strod,cplusplus.com上strod的文档说(强调我):

  

该函数首先根据需要丢弃尽可能多的空格字符(与isspace中一样),直到找到第一个非空格字符为止。 然后,从该字符开始,采用类似于浮点文字的语法,将尽可能多的有效字符,并将其解释为数值。

对于您而言,它成功地从输入20中读取了“ "20.njhggh"”,并在忽略其余部分的情况下将其返回。如果根本无法读取任何内容,stod包装函数只会抛出invalid_argument

stod有一个可选的第二个参数idx,该参数设置为读取数字后之后的第一个字符在str中的位置,因此您可以使用它来检测任何字符串中的非数字字符:

string word( "20.njhggh" );


size_t stodStart = distance( word.begin(), find_if_not( word.begin(), word.end(), isspace );
size_t stodEnd;
double var = stod( word, &stodEnd );
if( (stodEnd - stodStart) != word.length() ) throw "String is not entirely a floating-point number";

cout << var << endl;

请注意,上面的代码首先找到第一个非空白字符以测试stodEnd的值。