iostream C++奇怪的错误

Strange BUG in C++ iostream?

本文关键字:错误 C++ iostream      更新时间:2023-10-16

这是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<<"nn"<<value<<" yens is "<<value*dollars_in_yen<<" dollars. n";
        else if(valute=='e')
            std::cout<<"nn"<<value<<" euros is "<<value*dollars_in_euro<<" dollars. n";
        else if(valute=='p')
            std::cout<<"nn"<<value<<" pounds is "<<value*dollars_in_pound<<" dollars. n";
        else
            std::cout<<"nnSorry, unknown valute ("<<valute<<").n";
        }
    }

    int main(){
        money_conversion();
        return 0;
    }

当键盘输入

  • "5p"或

  • "5 p"或

  • "3y"或

  • "3 年"或

  • "1 z"或

  • 1z' 或

  • '
  • 10 e'

一切都按预期进行。

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

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

我把这当成一件大事,因为在大型代码中,这可能是一个几乎不可能注意到的错误。在某些情况下,'e'作为char输入是否是一个问题?

std::istreamstd::locale库函数尝试解析任何数字输入时,它总是首先获取集合"0123456789abcdefxABCDEFX+-"中的所有连续字符,这些字符可能对正在进行的转换类型有效,然后才尝试确定它们的含义。 请参阅num_get处理阶段 2 的说明。

所以在你的"5e"例子中,operator>>(double&)函数同时抓取'5''e',期望在'e'后找到一个指数,但停在那里,这些字符没有做一个有效的完整double

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

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

那是因为e用于在科学记数法中分离有效数指数,这是指定double的另一种方式。Threfore 10e 是一个无效的double因为它缺少定义指数的部分。

顺便说一下,使用英镑、欧元和日元(这是您要支持的货币的 ISO 代码)将不那么特殊。