当cin double时c ++挂起,但如果输入整数则继续

时间:2018-01-11 14:26:34

标签: c++

我有一个程序需要从用户读取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?

2 个答案:

答案 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'需要一个getlineignore需要另一个

这就是为什么你必须输入任何东西 +输入继续。