输入float后用户输入结束

时间:2015-07-03 11:05:44

标签: c++ getline

我正在尝试使用C ++程序将用户输入输出到空文件中。但是,在输入浮点数后,程序通过调用下一个会话来结束当前的输入会话。以下是用户输入功能的代码。

vector<Item> insertProducts()
{  
    vector<Item> products;

    string name;
    string code;
    float price;
    string unit;

    bool repeat = true;

    while(repeat) // program will keep asking for another round of input after one session ends
    {
        cout << "Enter product description: ";
        getline(cin, name);

        if(name.compare("#") != 0) // program stop asking for input if # is entered
        {
            cout << "Enter product code: ";
            getline(cin, code);
            cout << "Enter product unit price: ";
            cin >> price;
            cout << "Enter product unit phrase: ";
            getline(cin, unit);
            cout << "" << endl;

            Item newProduct = Item(code, name, price, unit);
            products.push_back(newProduct);
        }
        else
        {
            repeat = false;
            printCatalog(products);
        } 
    }

    return products;
}

下面是输入浮动价格后的结果,程序跳过单位短语的输入并右转进入另一轮输入。

Enter product description: Potato Chips
Enter product code: P3487
Enter product unit price: 1.9
Enter product unit phrase: Enter product description: 

我可以知道导致此问题的原因以及如何解决?

2 个答案:

答案 0 :(得分:2)

你的问题是在cin >> price;之后,用户用来终止价格输入的换行符仍在输入缓冲区中 - 它是下一个要读取的字符。然后,以下std::getline读取它并返回一个空行。

清除这种尾随换行符最强大的方法是告诉流忽略所有内容,包括下一个换行符:

cin >> price;
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

答案 1 :(得分:0)

使用

cin.ignore();

在调用getline()函数之前

或者,您可以尝试使用

cin.clear();
cin.sync();

代码的开头

这将刷新输入缓冲区。