簡體   English   中英

cin加倍時c ++掛起,但輸入整數則繼續

[英]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.clear() / cin.ignore() ,您的代碼可以正常工作。 我認為問題可能出在您忽略了第三項輸入,因此您必須重新輸入價格。 您甚至不需要第二個和第三個cin.ignore() ,因為getline()在這兩個( Source )之前。 這是一個工作REPL

組合

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM