0

ユーザーに double と long の文字列を入力してもらいたいのですが、最初は文字列が無視されて空のままになり、直接 double を入力するように求められます。

ここに私のコードがあります:

#include <iostream>
#include <string>

using namespace std;

int main () {
    string name;
    double price;
    long serial;

    cout << "Enter the dvd's name: "; getline(cin, name);
    cout << "Enter the dvd's price (in $): "; cin >> price;
    cout << "Enter the dvd's serial number: "; cin >> serial;

    cout << endl;

    cout << "Enter the dvd's name: "; getline(cin, name);
    cout << "Enter the dvd's price (in $): "; cin >> price;
    cout << "Enter the dvd's serial number: "; cin >> serial;

    return 0;
}

コードのコンソール

最初にわかるように、文字列を入力すると、2 回目に直接 double に送信されます。欠落している文字列を無視して、double と long を入力しても、name は空の文字列として出力されます。

コードの何が問題になっていますか?

4

2 に答える 2

1

私は通常、そのような場合にistringstreamを使用します(以下に示すように)。しかし、より良い解決策はcin.ignoreを使用することです

#include <sstream>

int main () {
    string name,line;
    double price;
    long serial;

    cout << "Enter the dvd's name: "; getline(cin, line);
    name = line;
    cout << "Enter the dvd's price (in $): ";
    getline(cin,line);
    istringstream(line)>>price;
    cout << "Enter the dvd's serial number: ";
    getline(cin,line);
    istringstream(line)>>serial;
    cout << endl;
    return 0;

}

于 2012-05-10T18:49:45.290 に答える
1

シリアル番号のの空白 (キャリッジ リターンまたはスペース)が取得されず、 が取得getlineします。

編集: johnathonが指摘してcin >> wsいるように、この場合は正しく機能しません(例は見つかりませんが、以前はこのように使用していたと思います)。

テスト済みの解決策:代わりに、シリアル番号の後にこれを追加すると、キャリッジ リターン (およびその他の空白) がストリームから取り出され、次の DVD 名の準備が整います。

string dummy;
getline(cin, dummy);
于 2012-05-10T17:41:50.827 に答える