#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"
的异常。它只是忽略小数点后的字母。
对于上述情况,我如何提出例外情况
答案 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
的值。