C++ 在没有空格的情况下使用e时出现奇怪的程序崩溃

C++ 在没有空格的情况下使用e时出现奇怪的程序崩溃,c++,C++,我有一个很奇怪的问题。该程序应该获取输入的值,将其转换为米,找出最大值和最小值,求和,最后打印所有信息。它似乎在任何情况下都有效,除非我添加一个以e为单位的值,没有空格。例如,如果我按5‘enter’e,它会工作,但如果我输入5e,它会完全崩溃。它不会对其他“错误”的单元执行此操作。e有什么特别之处吗?(本程序是为Stroustrup编程手册中的第4章钻孔编写的) #包括 #包括 #包括 #包括 #包括 使用名称空间std; 内联void保持窗口打开({char ch;cin>>ch;} 双cm

我有一个很奇怪的问题。该程序应该获取输入的值,将其转换为米,找出最大值和最小值,求和,最后打印所有信息。它似乎在任何情况下都有效,除非我添加一个以e为单位的值,没有空格。例如,如果我按5‘enter’e,它会工作,但如果我输入5e,它会完全崩溃。它不会对其他“错误”的单元执行此操作。e有什么特别之处吗?(本程序是为Stroustrup编程手册中的第4章钻孔编写的)

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
内联void保持窗口打开({char ch;cin>>ch;}
双cm_m(双x)//cm到m
{
返回x/100;
}
双进位m(双x)//进位到m
{
回报率(x*2.54)/100.0;
}
双英尺m(双x)//英尺到m
{
回报率(((x*12))*2.54)/100;
}
int main()
{
int z=0;
双初始值=0;
int w=1;
弦单元;
双和=0;
cout>init>>单元;
如果(单位!=“m”&&unit!=“cm”&&unit!=“ft”&&unit!=“in”&&unit!=“d”)//拒绝不需要的单位
{
而(单位!=“m”&&unit!=“cm”&&unit!=“ft”&&unit!=“in”&&unit!=“d”)
{
cout>单位;
}
}
如果(单位=“m”)
{

cout您正在执行所谓的“格式化提取”从一个流到一个
double
,然后到一个
char
。当你给它
5
然后
d
时,这些分别是
double
char
的有效输入。
double
部分的其他有效输入是
5.000
5.

但是,
5e
是中一个有效数字的开始,因此它被全部用于
double
,然后流状态被设置为“bad”,因为没有给定指数(例如
5e42
)。我们甚至从未到达
char
部分

因为流状态现在是“坏的”,所以所有后续的I/O操作也会失败,这可能是您在“它完全崩溃”时观察到的情况

(*但将被阻止,等待您在
字符中输入内容)

所以,是的,
e
是特别的

执行I/O后始终检查流状态。


当流出错时,您可能需要清除错误状态,然后提示用户从头开始重试。

您正在执行所谓的“格式化提取”从一个流到一个
double
,然后到一个
char
。当你给它
5
然后
d
时,这些分别是
double
char
的有效输入。
double
部分的其他有效输入是
5.000
5.

但是,
5e
是中一个有效数字的开始,因此它被全部用于
double
,然后流状态被设置为“bad”,因为没有给定指数(例如
5e42
)。我们甚至从未到达
char
部分

因为流状态现在是“坏的”,所以所有后续的I/O操作也会失败,这可能是您在“它完全崩溃”时观察到的情况

(*但将被阻止,等待您在
字符中输入内容)

所以,是的,
e
是特别的

执行I/O后始终检查流状态。


当流出错时,您可能希望清除错误状态,然后提示用户从头开始重试。

可能与
1e3
是一个值为
1000
e
是双字的一部分有关精细“完全崩溃”@KillzoneKid:与文字没有任何关系,是吗it@LightnessRacesinOrbit该页面解释了您在回答中的内容,可能与
1e3
是一个双精度值
1000
e
是双精度文本的一部分有关。精细“完全崩溃”@KillzoneKid:与文字没有任何关系,是吗it@LightnessRacesinOrbit这一页解释了你在回答中的内容
        #include<algorithm>
        #include<cmath>
        #include<iostream>
        #include<string>
        #include<vector>
        using namespace std;
        inline void keep_window_open() {char ch; cin >> ch;}


        double cm_m(double x) //cm to m
        {
            return x/100;   
        }
        double in_m(double x) //in to m
        {
            return (x*2.54)/100.0;
        }
        double ft_m(double x) //ft to m
        {
            return (((x*12))*2.54)/100;
        }

        int main()
        {
            int z=0;
            double init=0;
            int w=1;
            string unit;
            double sum=0;
            cout << "Enter an value and a unit (cm,m,in,ft) (To end the program, enter a value with 'd' as the unit. Avoid entering a unit of 'e' without a space.):\n";

            double val1=0;
            double val2=0;
            while(w==1)
            {
                cin >> init >> unit;
                if(unit!="m" && unit!="cm" && unit!="ft" && unit!="in" && unit!="d" ) //rejects unwanted units
                {
                    while(unit!="m" && unit!="cm" && unit!="ft" && unit!="in" && unit!="d")
                    {
                        cout << "Incorrect unit. Please enter a correct unit (m,cm,ft,in):\n";
                        cin >> unit;
                    }
                }
                if(unit=="m")
                {
                    cout << "\n" << init << "m\n";
                }
                if(unit=="cm")
                {
                    init=cm_m(init);
                    cout << "\n" << init << "m\n";
                }
                if(unit=="ft")
                {
                init=ft_m(init);
                cout << "\n" << init << "m\n";
                }
                if(unit=="in")
                {
                init=in_m(init);
                cout << "\n" << init << "m\n";
                }
                if(unit=="d") //d for "done"
                {
                    cout << "\nThe smallest number was: " << val2
                        << "\nThe largest number was: " << val1
                        << "\nThe sum of all numbers entered was: " << sum;
                        keep_window_open();
                        return 0;       
                }

                sum=init+sum;

                while(z<1) //This is set up so this 'while' loop is only used once to give initial values to val1 and val2
                {
                    cout << "\nSmallest so far." << '\t' << "Largest so far.\n";
                    val1=init;
                    val2=init;
                    ++z;
                }   
                if(init > val1)
                {
                    cout << "Largest so far.\n";
                    val1=init;
                }
                else if (init < val2)
                    {
                        cout << "Smallest so far.\n";
                        val2=init;
                    }
            }
        }
Input          Extraction to double       Then extraction to char     Stream state
-------------------------------------------------------------------------------------
5a             5                          a                           OK
5.000a         5.000                      a                           OK
5.a            5.                         a                           OK
5e             5e                         (n/a)                       BAD
5.e            5.e                        (n/a)                       BAD
5.000e         5.000e                     (n/a)                       BAD
5e42           5e42                       (n/a)                       OK*
5e42a          5e42                       a                           OK