标准输入流 cin 无法提示输入
standard input stream cin failing to prompt for input
1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6 const double yen_to_euro=0.007215;
7 const double euro_to_dollar=1.12;
8 char currency;
9 double x;
10
11 while(currency!='q')
12 {
13 cout << "enter currency and unit(y , e, or d)";
14 cin >> x >>currency;
15
16 switch(currency){
17
18 case 'y':
19 cout <<"euro:"<< x*yen_to_euro<<" dollar:"<<x*yen_to_euro*euro_to_dollar<<'\n';
20 break;
21 case 'e':
22 cout <<"yen:"<< (x*(1.0/yen_to_euro))<<" dollar:"<<(x*euro_to_dollar)<<'\n';
23 break;
24 case 'd':
25 cout <<" yen:"<< x*(1.0/yen_to_euro)*(1.0/euro_to_dollar)<<" euro:"<<x*(1.0/euro_to_dollar)<<'\n';
26 break;
27 case 'q':
28 currency='q';
29 break;
30 default:
31 cout << "invalid";
32 break;
33
34 }
35
36 }
37
38
39 }
~
上述代码的预期功能是将选定的货币(y 表示日元,e 表示欧元,d 表示美元)转换为其他货币。
例如,如果我想兑换成 12 日元,我会输入:
12y
然后程序将输出
euro:0.08658 dollar:0.0969696
但是,如果我输入 12e,我将收到一个无限循环。仔细检查代码,似乎没有任何逻辑错误。
不过,我觉得问题的根源与第 14 行的 cin 有关,因为如果我像这样分别取金额 x 和货币类型:
cin>> x;
cin>> currency;
代码运行良好,但我需要输入金额,然后按回车键,然后按代表货币类型的字符。有没有办法只在一行中输入所有内容,没有空格?
另外,为什么会这样?这种无限循环的不寻常行为只会在我输入 e 代表欧元,输入 q 代表退出时发生。
替换cin >> x >>currency;
try{
std::string myLine;
std::getline (std::cin, myLine); // store line into myLine.
currency = myLine.back(); // get last character from line.
myLine.pop_back(); // remove last character from myLine.
x = std::stod(myLine); // try to conver the rest of the string to a double.
}
catch (...) {
//The user typed in something invalid.
currency= 'i';
}
此外,请确保 #include <string>
请注意,此解决方案假定您使用的是 C11。
12e 被解释为浮点数的开头,如 12e03。但是结尾不见了,所以你的流被置于错误状态(failbit)。此状态会导致所有后续输入失败,直到清除失败状态。
您可以有一个内部循环来检查此类格式错误:
while (...) {
...
while ( (cin >> x >> currency).fail() && !cin.eof()) { // loops as long as there's input and it's invalid
cout << "invalid format";
cin.clear();
}
if (cin.eof()) // if there's no longer input stop looping
break;
...
}
请注意,如果您想确保在任何情况下都执行循环,则应将 currency
初始化为不同于 'q' 的值。
顺便说一句,如果您输入 12 e(带有 space),12 将被解释为数字,并如您所料将 x 和 e 放入货币。
正如其他答案所解释的那样,12e 指的是浮点数的科学计数法,因此 currency
不存储 'e'。
要在没有 space 的情况下在单行中获取输入,您应该使用 std::getline
然后解析输入字符串。
由于您知道最后一个字符始终表示货币,因此可以使用 std::stoi
将前面的字符转换为数字。
1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6 const double yen_to_euro=0.007215;
7 const double euro_to_dollar=1.12;
8 char currency;
9 double x;
10
11 while(currency!='q')
12 {
13 cout << "enter currency and unit(y , e, or d)";
14 cin >> x >>currency;
15
16 switch(currency){
17
18 case 'y':
19 cout <<"euro:"<< x*yen_to_euro<<" dollar:"<<x*yen_to_euro*euro_to_dollar<<'\n';
20 break;
21 case 'e':
22 cout <<"yen:"<< (x*(1.0/yen_to_euro))<<" dollar:"<<(x*euro_to_dollar)<<'\n';
23 break;
24 case 'd':
25 cout <<" yen:"<< x*(1.0/yen_to_euro)*(1.0/euro_to_dollar)<<" euro:"<<x*(1.0/euro_to_dollar)<<'\n';
26 break;
27 case 'q':
28 currency='q';
29 break;
30 default:
31 cout << "invalid";
32 break;
33
34 }
35
36 }
37
38
39 }
~
上述代码的预期功能是将选定的货币(y 表示日元,e 表示欧元,d 表示美元)转换为其他货币。
例如,如果我想兑换成 12 日元,我会输入:
12y
然后程序将输出
euro:0.08658 dollar:0.0969696
但是,如果我输入 12e,我将收到一个无限循环。仔细检查代码,似乎没有任何逻辑错误。 不过,我觉得问题的根源与第 14 行的 cin 有关,因为如果我像这样分别取金额 x 和货币类型:
cin>> x;
cin>> currency;
代码运行良好,但我需要输入金额,然后按回车键,然后按代表货币类型的字符。有没有办法只在一行中输入所有内容,没有空格?
另外,为什么会这样?这种无限循环的不寻常行为只会在我输入 e 代表欧元,输入 q 代表退出时发生。
替换cin >> x >>currency;
try{
std::string myLine;
std::getline (std::cin, myLine); // store line into myLine.
currency = myLine.back(); // get last character from line.
myLine.pop_back(); // remove last character from myLine.
x = std::stod(myLine); // try to conver the rest of the string to a double.
}
catch (...) {
//The user typed in something invalid.
currency= 'i';
}
此外,请确保 #include <string>
请注意,此解决方案假定您使用的是 C11。
12e 被解释为浮点数的开头,如 12e03。但是结尾不见了,所以你的流被置于错误状态(failbit)。此状态会导致所有后续输入失败,直到清除失败状态。
您可以有一个内部循环来检查此类格式错误:
while (...) {
...
while ( (cin >> x >> currency).fail() && !cin.eof()) { // loops as long as there's input and it's invalid
cout << "invalid format";
cin.clear();
}
if (cin.eof()) // if there's no longer input stop looping
break;
...
}
请注意,如果您想确保在任何情况下都执行循环,则应将 currency
初始化为不同于 'q' 的值。
顺便说一句,如果您输入 12 e(带有 space),12 将被解释为数字,并如您所料将 x 和 e 放入货币。
正如其他答案所解释的那样,12e 指的是浮点数的科学计数法,因此 currency
不存储 'e'。
要在没有 space 的情况下在单行中获取输入,您应该使用 std::getline
然后解析输入字符串。
由于您知道最后一个字符始终表示货币,因此可以使用 std::stoi
将前面的字符转换为数字。