C ++ iostream中的奇怪BUG?

时间:2017-11-02 09:52:44

标签: 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;

    }

键盘输入

  • &#39; 5P&#39;或

  • &#39; 5 p&#39;或

  • &#39; 3Y&#39;或

  • &#39; 3 y&#39;或

  • &#39; 1 z&#39;或

  • 1Z&#39;或

  • &#39; 10 e&#39;

一切都按预期进行。

输入为'(anyting)e'时出现错误(如'5e') 我已尝试过几乎所有尝试使它工作但没有成功。

当我删除while()循环时,我在输入'5e'时获得此输出 - &gt; "Sorry, unknown valute ( )"但是当我输入时我们说'7m'我得到输出"Sorry, unknown valute (m)."

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

2 个答案:

答案 0 :(得分:5)

Array result: arrTimer: 2.975ms Object result: objTimer: 0.068ms std::istream库函数尝试解析任何数字输入时,它始终首先捕获集合std::locale中的所有连续字符,这些字符可能对转换类型有效正在完成,然后才试图确定它们的含义。请参阅Stage 2 of the num_get processing的说明。

因此,在"0123456789abcdefxABCDEFX+-"示例中,"5e"函数同时抓取operator>>(double&)'5',期望在'e'之后找到一个指数,但在那里停止,这些角色不能制作有效的完整'e'

答案 1 :(得分:3)

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

您需要在输入中读取std::string并自行提取值和货币。

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

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