我正在完成一个实验室作业,提示用户输入他们想要订购的鱼的类型并输入每磅的价格。在报告打印之前,需要提示用户输入鱼类和价格两次。
问题是程序在循环的第一个实例完成之前结束。 (编写代码的方式是报表上的标题将打印两次,但这是在说明中。)
代码如下,非常感谢任何帮助。
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
float price;
string fishType;
int counter = 0;
// Change the console's background color.
system ("color F0");
while (counter < 3){
// Collect input from the user.
cout << "Enter the type of seafood: ";
cin >> fishType; // <------ FAILS AT THIS POINT. I GET THE PROMPT AND AT THE "ENTER" IT DISPLAYS THE REPORT
cout << "Enter the price per pound using dollars and cents: ";
cin >> price;
counter++;
}
// Display the report.
cout << " SEAFOOD REPORT\n\n";
cout << "TYPE OF PRICE PER" << endl;
cout << "SEAFOOD POUND" << endl;
cout << "-------------------------------" << endl;
cout << fixed << setprecision(2) << showpoint<< left << setw(25)
<< fishType << "$" << setw(5) << right << price << endl;
cout << "\n\n";
system ("pause");
return 0;
}
答案 0 :(得分:7)
使用price
cin >> price; // this will not consume the new line character.
的{{3}}读取不会消耗新的行字符:
fishType
使用std::istream::operator>>(float)
)在下一次阅读中将新行字符存在到cin >> fishType; // Reads a blank line, effectively.
中:
fishType
然后price
将读取(并且未成为)下一个float
的用户输入,因为它不是有效的price
值。
在阅读cin.ignore(1024, '\n');
// or: cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
之后,将operator>>(std::istream, std::string)
更正为下一个换行符。类似的东西:
if (cin >> price)
{
// success.
}
始终检查输入操作的状态以确定它们是否成功。这很容易实现:
fishType
如果operator>>(std::istream, std::string)
可以包含空格,那么使用if (std::getline(cin, fishType))
{
}
是不合适的,因为它会在第一个空格处停止读取。请改用ignore()
:
stdin
当用户输入输入时,新的行字符将写入cin
,即cin >> fishType; // fishType == "cod" as operator>> std::string
// will read until first whitespace.
:
cod\n 1.9\n salmon\n 2.7\n
循环的第一次迭代:
cin
和cin >> price; // This skips leading whitespace and price = 1.9
现在包含:
\n 1.9\n salmon\n 2.7\n
然后:
cin
和cin >> fishType; // Reads upto the first whitespace
// i.e reads nothin and cin is unchanged.
cin >> price; // skips the whitespace and fails because
// "salmon" is not a valid float.
现在包含:
\n salmon\n 2.7\n
然后:
{{1}}