C++ C+中的奇怪BUG+;iostream?

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<&

这是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<<"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
的另一种方式。Threfore
10e
是无效的
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点-从当前区域设置中提取正确的字符:)