我有一个程序需要从用户读取3个属性。它可以读取前2个就好了,当它试图读取第3个属性(双精度)时它会冻结,直到你输入一个整数。
这是代码
#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <iomanip>
using namespace std;
#include <string>
#include "book.h"
Book::Book(const std::string &serialNo, const std::string &title, double price) : serialNo(serialNo), title(title),
price(price) {}
const std::string &Book::getSerialNo() const {
return serialNo;
}
void Book::setSerialNo(const std::string &serialNo) {
Book::serialNo = serialNo;
}
const std::string &Book::getTitle() const {
return title;
}
void Book::setTitle(const std::string &title) {
Book::title = title;
}
double Book::getPrice() const {
double scale = .1;
return (int)(price / scale) * scale;
}
void Book::setPrice(double price) {
Book::price = price;
}
map<string, Book *> addNewBook(map<string, Book *> inventory) {
printf("**Add New Book**\n\nNote: Type quit and enter on the serial no. to return to the Main Menu\n");
string serialNo, title;
double price;
while(serialNo != "quit") {
printf("Serial No.:");
cin >> serialNo;
if (serialNo == "quit") {
continue;
}
cin.clear();
cin.ignore(100, '\n');
printf("\nTitle: ");
getline(cin, title);
printf("\nPrice: ");
cin.clear();
cin.ignore(100, '\n');
cin >> price;
if (inventory.find(serialNo) == inventory.end()) {
inventory[serialNo] = new Book(serialNo, title, price);
} else {
printf("Serial No. exist already, please enter again:\n");
}
cin.clear();
cin.ignore(100, '\n');
}
return inventory;
}
int main() {
map<string, Book*> inventory;
addNewBook(inventory);
}
如果您为前2个输入输入一些字符串,而对于第3个输入则输入2.5,那么它将一直挂起,直到您输入类似12的输入。
如何阻止挂起并让它读取2.5?
答案 0 :(得分:1)
我不确定实际的错误是什么,但为了解决您的问题,我刚刚删除了第二个和第三个cin.clear()
/ cin.ignore()
,您的代码正常运行。我相信问题可能在于您无视第三个输入,因此您必须重新输入价格。您甚至不需要第二个和第三个cin.ignore()
,因为getline()
在两者之前(Source)。这是一个有效的repl。
答案 1 :(得分:0)
组合
cin >> serialNo;
cin.clear();
cin.ignore(100, '\n');
用于通过operator>>
吃掉输入缓冲区中留下的换行符。这样做是因为跟随它的getline
不会将缓冲区视为空行+ \n
。
然而,getline
的不同之处在于,当读取整行时 在最后消耗\n
,并且在输入缓冲区中不留下任何内容。
所以现在
getline(cin, title);
cin.clear();
cin.ignore(100, '\n');
'\n'
需要一个getline
,ignore
需要另一个。
这就是为什么你必须输入任何东西 +输入继续。