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;
}
当键盘输入为
'5p' 或
'5p' 或
'3y' 或
'3 y' 或
'1 z' 或
1z' 或
'10e'
一切如预期。
当输入为 '(anyting)e'
时,这是一个错误(如 '5e'
)
我已经尝试了几乎所有的方法来让它工作但没有成功。
当我删除 while()
循环时,我在输入 '5e'
时得到这个输出 ->
"Sorry, unknown valute ( )"
但是当我输入时可以说 '7m'
我得到输出 "Sorry, unknown valute (m)."
我非常重视这一点,因为在大型代码中,这可能是一个几乎不可能被注意到的错误。
在某些情况下 'e'
输入 char
是个问题吗?
当 std::istream
或 std::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 代码)不会那么特殊。
这是 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;
}
当键盘输入为
'5p' 或
'5p' 或
'3y' 或
'3 y' 或
'1 z' 或
1z' 或
'10e'
一切如预期。
当输入为 '(anyting)e'
时,这是一个错误(如 '5e'
)
我已经尝试了几乎所有的方法来让它工作但没有成功。
当我删除 while()
循环时,我在输入 '5e'
时得到这个输出 ->
"Sorry, unknown valute ( )"
但是当我输入时可以说 '7m'
我得到输出 "Sorry, unknown valute (m)."
我非常重视这一点,因为在大型代码中,这可能是一个几乎不可能被注意到的错误。
在某些情况下 'e'
输入 char
是个问题吗?
当 std::istream
或 std::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 代码)不会那么特殊。