C++ C++;字符串到双解析,有异常吗?

C++ C++;字符串到双解析,有异常吗?,c++,string,double,C++,String,Double,在java中,如果我想创建一个可以接收双精度和字符串作为适当输入的应用程序,我可能会执行以下操作: String input = getInput();// try { double foo = Double.valueOf(input); //Do stuff with foo here } catch (NumberFormatException e) { //Do other validation with input } 你如何在C++中做这个?code

在java中,如果我想创建一个可以接收双精度和字符串作为适当输入的应用程序,我可能会执行以下操作:

String input = getInput();//
try { 
    double foo = Double.valueOf(input);
    //Do stuff with foo here 
} catch (NumberFormatException e) { 
    //Do other validation with input
} 
<>你如何在C++中做这个?code>atof()为无效输入返回0.0,但如何将其与有效的双精度“0.0”区分开来?顺便说一句,我只能在这个项目中包括
。我假设我需要以某种方式使用
cin
,但是在
cin
无法将某些字符串解析为双精度字符串后,如何获取原始输入

编辑:我可能会使用以下内容,但正如我之前所说的,由于某些原因,我不允许在此作业中导入

string input;
getline(cin, input);

double x;
istringstream foo(input);
foo >> x
if(cin){
    //do manipulations with x
}
else{
    //since it's not a number, check if input is a valid command etc..
}

<> P> C++标准库似乎避免了很多人可能会想到的异常,这可能不是你想听的答案,但是解析双打并不完全是火箭科学,所以也许“手工”可以吗?
注意:如果您这样做,您可能希望将其收集为一个整数,然后转换为一个双精度数,并在小数点后除以10位数字。

C++流将好、坏和失败状态标志关联起来。它们分别存储在
ios\u base::goodbit
ios\u base::badbit
ios\u base::failbit
中,但通常通过
ios::good()
ios::bad()
ios::fail()
访问。还有
ios\u base::eofbit
ios::eof()
但是我们暂时忽略这一点

如果解析失败,则会出现错误位。此外,流对象可以转换为布尔兼容类型。如果流处于良好状态,则语句

if( stream )
计算为true。否则,它会将其评估为false。有了这个,从标准输入中获取一个值可以归结为:

#include <iostream>

// ...
double d = 0;
if ( std::cin >> d ) {
    // input is a double. handle that here.
} else {
    // input isn't a double. handle that here.
}
#包括
// ...
双d=0;
如果(标准::cin>>d){
//输入是双精度的。在这里处理它。
}否则{
//输入不是双精度的。在这里处理。
}

应为特殊情况保留例外情况。虽然你当然可以这样滥用它们,但这是一个糟糕的想法——很明显,你期待的不是双倍,所以把它当作例外是没有任何实际意义的

唯一真正的问题是您希望将输入作为字符串处理的确切情况。例如,如果输入字符串类似于“1.23e2非数字数据”,您是希望将“1.23e2”用作数字,还是希望将整个字符串视为一个字符串

无论哪种方式,您都希望我们对转换
strtod
——区别只是您对它返回的内容的反应。特别是,
strtod
采用两个参数,而不是像
atof
那样只采用一个参数。第二个参数是指向char的指针。假设您传递了一个非空指针,
strod
会将其设置为指向输入字符串中成功转换的最后一个字符。如果它指向输入字符串的开头,则未转换任何内容。如果它指向终点,一切都被转化了。如果它介于两者之间,则字符串的一部分被转换,而另一部分未被转换

目前,我假设您想要一个双精度值,其中包含字符串开头可以转换的数字,而不能转换的数字则被视为字符串:

#include <stdlib.h>
#include <stdio.h>

int main() { 
    char input[] = "12.34 non-numeric data";
    char *string;
    double value = strtod(input, &string);

    printf("Number: %f\tstring: %s\n", value, string);
    return 0;
}
#包括
#包括
int main(){
字符输入[]=“12.34非数字数据”;
字符*字符串;
双值=strtod(输入和字符串);
printf(“编号:%f\t字符串:%s\n”,值,字符串);
返回0;
}
尝试stdlib.h中的“strtod”

您可以查看一下,这将允许您编写相当于Java代码的代码:

string input;
getline(cin, input);

try {
    double x = boost::lexical_cast<double>(input);
    //Do manipulations with x
} catch (boost::bad_lexical_cast &) {
    //Do other validation with input
}
字符串输入;
getline(cin,输入);
试一试{
双x=boost::词法转换(输入);
//用x进行操作
}捕获(boost::错误的\u词法\u cast&){
//对输入进行其他验证
}

在发布之前,我只是在玩
strod
来确认这一点。唯一需要注意的是,我认为即使只跳过了空格,
endptr
也会进步。有人能证实这一点吗?@torak:
endptr
将指向转换后的内容。如果未转换任何内容,则它将指向输入字符串的开头,即使将跳过空白以获取数字数据。因此,“1.2x”将转换为1.2,
endptr
将指向“x”,而“x”将不会转换,
endptr
将指向“x”。感谢您阅读我的整个帖子,并提供了一个很好的答案。我可能最终会使用这个,除非我能破解出类似于cin的东西。实际的程序是一个简单的基于反向波兰符号的计算器,它一次读取一个输入。输入要么是要放在堆栈上的十进制数,要么是用于特殊操作的两个保留字符中的一个,如退出程序的“q”。我理解cin的基本功能,但我试图避免的是第二次提示用户进行特定输入,因为双精度和字符都是程序的有效输入。有没有一种方法可以在原始输入无法解析Double后检索它。我可能有点离谱,但有点像cin.seekg(-1*cin.gcount(),ios::cur);是否重试?如果输入不是双精度的,如何解析输入?通常我只是将输入读入一个
std::string
,然后将其重新插入
std::stringstream
,然后检查它是否是双精度的…这就是我计划做的,但是我们的教授将我们限制在我在原始帖子中提到的库中,不幸的是,sstream和fstream都不是一个选项。如果没有简单的方法,那么就用艰难的方法。。。如果
atof
返回0,请再次手动检查字符串是否为字符串。