Ввод и вывод в консоли внутри цикла - PullRequest
0 голосов
/ 16 мая 2018

Я делаю программу на C ++ для работы с книгами. Пользователь должен вставить название, цену и объем для 3 книг. Я не включаю класс Book в код, так как он не имеет отношения к моей проблеме.

Я застрял в том месте, где пользователю нужно ввести значения внутри цикла. Когда я тестирую программу, консоль продолжает глючить в случайное время. (то есть вместо полного предложения оно показывает "Give book p" и ожидает ввода).

Я прочитал в других ответах, что я должен использовать cin.ignore() после каждого cin>> вызова, чтобы игнорировать \n, который помещается в поток, когда пользователь нажимает enter, но это не решает мою проблему?

Есть идеи, что я делаю не так?

#include <iostream>
#include <sstream>

using namespace std;

int main() {
    string title;
    double price;
    int volumes;

    for (int i=0; i<3;i++){
        cout << "Give book title : " << endl;
        getline (cin, title);
        cout << "Give book price : " << endl;
        cin >> price;
        cin.ignore();
        cout << "Give number of volumes : " << endl;
        cin >> volumes;
        cin.ignore();
    }

    return 0;
}

Ниже приведен пример консоли:

Give book title :
The Hobbit
The Hobbit
Give book price :
12.5
12.5
Give number of volumes :
10
10
Give book title :
Lord of the Rings
Lord of the Rings
Give book price :
12
12
Give number of volumes :
7
7
Give bo

Как видите, последнее предложение обрезается, а консоль застревает после.

1 Ответ

0 голосов
/ 11 июля 2018

Вы можете использовать std::ws в качестве параметра для вашего getline() метода для достижения вашей цели.

Следующий код будет служить вашей цели:

#include <iostream>

int main() {
    std::string title;
    double price;
    int volumes;

    for (int i=0; i<3;i++){
        std::cout << "Give book title : ";
        std::getline(std::cin >> std::ws, title);
        std::cout << "Give book price : ";
        std::cin >> price;
        std::cout << "Give number of volumes : ";
        std::cin >> volumes;
        std::cout<<"Title: "<<title<<" costs "<<price<<" for "<<volumes<<" volumes.\n";
    }

     return 0;
}

Это даст следующий вывод:

Give book title : Harry Potter
Give book price : 12.5
Give number of volumes : 5
Title: Harry Potter costs 12.5 for 5 volumes.
Give book title : James Anderson
Give book price : 45.6
Give number of volumes : 7
Title: James Anderson costs 45.6 for 7 volumes.
Give book title : Lucas Empire
Give book price : 34.5
Give number of volumes : 7
Title: Lucas Empire costs 34.5 for 7 volumes.
...