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