[英]c++ hangs when cin double but proceeds if entering an integer
我有一個程序需要從用戶讀取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.5的字符串,則它將掛起,直到您輸入類似12的字符串。
如何防止掛起並使其讀取2.5?
組合
cin >> serialNo;
cin.clear();
cin.ignore(100, '\n');
用來吃掉由operator>>
保留在輸入緩沖區中的換行符。 這樣做是為了使它后面的getline
不會將緩沖區視為empty-line + \\n
。
但是, getline
的不同之處在於,在讀取整行時,它確實會消耗\\n
,並且在輸入緩沖區中不保留任何內容。
所以現在
getline(cin, title);
cin.clear();
cin.ignore(100, '\n');
期望一個'\\n'
代表getline
, 另一個代表ignore
。
這就是為什么您必須輸入任何內容並輸入才能繼續。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.