Tôi đang cố lấy một vài tham số do người dùng nhập từ bảng điều khiển, hai chuỗi, hai int và double. Mã liên quan Tôi đang cố gắng để sử dụng là:C++ getline() không chờ kết nối từ bàn điều khiển khi được gọi nhiều lần
#include <string>
#include <iostream>
using namespace std;
// ...
string inputString;
unsigned int inputUInt;
double inputDouble;
// ...
cout << "Title: ";
getline(cin, inputString);
tempDVD.setTitle(inputString);
cout << "Category: ";
getline(cin, inputString);
tempDVD.setCategory(inputString);
cout << "Duration (minutes): ";
cin >> inputUInt;
tempDVD.setDuration(inputUInt);
cout << "Year: ";
cin >> inputUInt;
tempDVD.setYear(inputUInt);
cout << "Price: $";
cin >> inputDouble;
tempDVD.setPrice(inputDouble);
Tuy nhiên, khi chạy chương trình, thay vì chờ đợi cho inputString đầu tiên được nhập vào, các mã số không dừng lại cho đến khi getline thứ hai() gọi . Do đó, giao diện điều khiển đầu ra trông như thế này:
Tiêu đề: Thể loại:
với con trỏ xuất hiện sau khi loại. Nếu tôi nhập vào bây giờ, chương trình sau đó nhảy tiến tới đầu vào năm, không cho phép tôi nhập nhiều hơn một chuỗi. Điều gì đang xảy ra ở đây?
Không thể sinh sản; xin vui lòng gửi thực, mã hoàn chỉnh. Tôi đặt cược vấn đề của bạn nằm ở nơi khác. Ngoài ra, không trộn đầu vào được định dạng và 'getline()'. –
@KerrekSB: Tôi đồng ý rằng việc trộn chúng là một triệu chứng của kiểu xấu, nhưng lý do khách quan để không trộn chúng là gì? Tôi nghĩ rằng nó là hoàn toàn hợp lệ để trộn chúng, thực sự. – sehe
@sehe: Vấn đề là việc trích xuất được định dạng không tiêu thụ các dòng mới, vì vậy rất dễ dàng để có được các kết quả không mong muốn khi bạn 'getline()' sau khi nghĩ rằng bạn đã xử lý tất cả dòng trước đó. Tôi không nói điều đó là không thể, nhưng nó thường làm cho logic rất khó đọc và duy trì. –