第一次尝试时循环失败

时间:2013-02-20 23:10:04

标签: c++

我正在完成一个实验室作业,提示用户输入他们想要订购的鱼的类型并输入每磅的价格。在报告打印之前,需要提示用户输入鱼类和价格两次。

问题是程序在循环的第一个实例完成之前结束。 (编写代码的方式是报表上的标题将打印两次,但这是在说明中。)

代码如下,非常感谢任何帮助。

#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;
}

1 个答案:

答案 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}}