C++ iostream 中的奇怪 BUG?

Strange BUG in C++ iostream?

这是 iostream 中的错误吗? ...

        #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;

    }

当键盘输入为

一切如预期。

当输入为 '(anyting)e' 时,这是一个错误(如 '5e') 我已经尝试了几乎所有的方法来让它工作但没有成功。

当我删除 while() 循环时,我在输入 '5e' 时得到这个输出 -> "Sorry, unknown valute ( )" 但是当我输入时可以说 '7m' 我得到输出 "Sorry, unknown valute (m)."

我非常重视这一点,因为在大型代码中,这可能是一个几乎不可能被注意到的错误。 在某些情况下 'e' 输入 char 是个问题吗?

std::istreamstd::locale 库函数尝试解析任何数字输入时,它总是首先获取集合 "0123456789abcdefxABCDEFX+-" 中的所有连续字符,这些字符可能对该类型有效完成转换,然后才尝试确定它们的含义。请参阅 Stage 2 of the num_get processing.

的说明

因此在您的 "5e" 示例中,operator>>(double&) 函数同时获取 '5''e',希望在 'e' 之后找到指数,但是停在那里,这些字符不能构成有效的完整 double.

不,这不是 C++ 流中的错误类。

您需要将输入作为 std::string 读取并自行提取值和货币。

那是因为e科学计数法中用来分隔有效数指数,这是指定 double 的另一种方式。因此 10e 是无效的 double,因为它缺少定义指数的部分。

顺便说一下,使用 GBP、EUR 和 JPY(它们是您要支持的货币的 ISO 代码)不会那么特殊。