1

ユーザーが注文したい魚の種類とポンドあたりの価格を入力するように求められるラボの割り当てを完了しています。レポートを印刷する前に、魚の種類と価格を 2 回入力する必要があります。

問題は、ループの最初のインスタンスが完了する前にプログラムが終了することです。(コードの書き方により、レポートのタイトルが 2 回印刷されますが、それは説明書に記載されていました。)

コードは以下にあり、どんな支援も大歓迎です。

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

1 に答える 1

7

改行文字はstd::istream::operator>>(float)price:のを使用した読み取りによって消費されません。

cin >> price; // this will not consume the new line character.

operator>>(std::istream, std::string))を使用した次の読み取り中の改行文字の存在fishType

cin >> fishType; // Reads a blank line, effectively.

次に、次のユーザー入力は有効な値ではないため、fishTypeによって読み取られます(読み取りに失敗します) 。pricefloat

修正するには、。ignore()の読み取り後の次の改行文字までprice。何かのようなもの:

cin.ignore(1024, '\n');
// or: cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

入力操作のステータスを常にチェックして、成功したかどうかを判断してください。これは簡単に実現できます。

if (cin >> price)
{
    // success.
}

fishTypeにスペースを含めることができる場合はoperator>>(std::istream, std::string)、最初の空白で読み取りが停止するため、使用は適切ではありません。std::getline()代わりに使用してください:

if (std::getline(cin, fishType))
{
}

ユーザーが入力を入力すると、改行文字が次のように書き込まれstdinますcin

cod \ n
1.9 \ n
鮭\n
2.7 \ n

ループの最初の反復で:

cin >> fishType; // fishType == "cod" as operator>> std::string
                 // will read until first whitespace.

そしてcin今含まれています:

\ n
1.9 \ n
鮭\n
2.7 \ n

それから:

cin >> price; // This skips leading whitespace and price = 1.9

そしてcin今含まれています:

\ n
鮭\n
2.7 \ n

それから:

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.
于 2013-02-20T23:13:29.093 に答える