C++ C+中的奇怪BUG+;iostream?
这是iostream中的一个bug吗C++ C+中的奇怪BUG+;iostream?,c++,iostream,C++,Iostream,这是iostream中的一个bug吗 #include<iostream> void money_conversion (){ constexpr double dollars_in_yen=0.01; constexpr double dollars_in_euro=1.16; constexpr double dollars_in_pound=1.33; std::cout<&
#include<iostream>
void money_conversion (){
constexpr double dollars_in_yen=0.01;
constexpr double dollars_in_euro=1.16;
constexpr double dollars_in_pound=1.33;
std::cout<<"Supported valutes : yen ('y'), euros('e'), pounds('p').\n";
std::cout<<"Please enter the value + valute that you want to convert into dollars! :";
double value=1;
char valute=0;
while(true){
std::cin>>value>>valute;
if(valute=='y')
std::cout<<"\n\n"<<value<<" yens is "<<value*dollars_in_yen<<" dollars. \n";
else if(valute=='e')
std::cout<<"\n\n"<<value<<" euros is "<<value*dollars_in_euro<<" dollars. \n";
else if(valute=='p')
std::cout<<"\n\n"<<value<<" pounds is "<<value*dollars_in_pound<<" dollars. \n";
else
std::cout<<"\n\nSorry, unknown valute ("<<valute<<").\n";
}
}
int main(){
money_conversion();
return 0;
}
#包括
无效货币转换(){
constexpr双美元日元=0.01;
constexpr双美元欧元=1.16;
constexpr双美元(单位:英镑)=1.33;
标准:库特瓦特;
如果(值=='y')
std::cout当std::istream
或std::locale
库函数试图解析任何数字输入时,它总是首先获取集合中的所有连续字符“0123456789abcdefxABCDEFX+-”
,这可能对正在进行的转换类型有效,然后才尝试确定它们的含义。请参阅的说明
因此,在您的“5e”
示例中,操作符>>(double&)函数既获取了<代码> > '5':/>代码> <代码> e '/COD>,期望在<代码> e '/COD>之后找到一个指数,但在那里停止,并且这些字符没有有效的完整代码<双/>代码> < P>不,这是>No.>强> > C++流类中的一个bug。
您需要以std::string
的形式读入输入,然后自己提取值和货币
这是因为在科学记数法中,e
用于分隔有效位和指数,这是指定double
的另一种方式。Threfore10e
是无效的double
,因为它缺少定义指数的部分
顺便说一下,使用英镑、欧元和日元(这是您想要支持的货币的ISO代码)将不那么特殊。我猜e
被解析为浮点指数的一部分。是的,'5e2'被解析为'500',因此它缺少其余的输入,这就是它成为无限循环的原因。感谢上帝bless@tobi303将7m
读为double是一个很好的定义:它应该读7
,并将m
留在stream@M.M 真的吗?那么我学到了什么东西)经验法则:当问题是“这个图书馆有一个bug被数百万人使用”时,答案很可能是“否”。我在C++中使用了20年后仍然使用这个假设。我有点理解你在这里所说的。但是,“5C”输入给出了合法的输出:“对不起,未知的Valuter(C))。'并且没有无限循环错误。与a、b、d、f相同。只有'(数字)e'是问题-'5e2e'产生合法的输出:“500欧元等于580美元。”希望有一天,如果0o
成为八进制文字的前缀,我们可以将o
添加到该列表中。您遗漏了第2阶段的一个关键部分:“进行检查以确定是否允许c作为阶段1返回的转换说明符输入字段的下一个字符。“这条规则就是为什么7a
,7b
等可以,但7e
可以的原因not@M.M谢谢,我完全错过了这一部分!现在应该更正确了。我建议提取一个整数,然后如果下一个字符是
,则提取另一个integerFair点-从当前区域设置中提取正确的字符:)