[C ++中的cin缓冲区问题

问题描述 投票:1回答:4

我正在学习C ++,所以我不完全了解我的代码在这里发生了什么,但是从我能够搜集到的信息来看,这似乎可能是某种缓冲区问题。

#include <stdio.h>
#include <vector>
#include <iostream>
#include <typeinfo>

using namespace std;

bool stopRun = true;
int height, average, total, count;
vector <int> heights;

int main ()
{
    while (stopRun)
    {
        cout << "Enter a height, or 'end' to quit: ";
        cin >> height;
        if (typeid(height).name() == "i")
        {
            heights.push_back(height);
            cout << heights[0];
            count++;
        }
        else if (typeid(height).name() == "i")
        {
            cout << "\nPlease enter an integer: ";
            continue;
        }
        if (count == 5)
        {
            stopRun = false;
        }
    }
    for (int i = 0; i < heights.size(); i++)
    {
        total += heights[i];
        cout << "\nTotal: " << total;
    }
    return 0;
}

由于某种原因,此代码将连续输出:“输入高度,或'结束'以退出:”。在较早的版本中,它将输出:“输入高度,或'结束'以退出:请输入整数:”。

我想这是我的“身高>>”;行从“请输入整数:”中提取输出,并将其作为我的输入,这将其标识为不是整数类型,这将启动无限循环。

如何清除输入缓冲区,以免输入cout语句?还是我在这里遇到的问题?

提前感谢!

c++ buffer infinite-loop cin cout
4个回答
0
投票

我建议抓住绳子。如果字符串不是“ end”,则在try / catch内转换为数字


0
投票

您可以在程序fflush(stdin)的开始使用此功能。它将清除您的输入缓冲区。


0
投票

您正在尝试在同一行代码中读取intstring。我建议您使用getline()读取输入,然后尝试将string转换为int

std::string input;
while (heights.size() != 5) {
    cout << "Enter a height, or 'end' to quit: ";
    if (std::getline(cin, input)) {
        if (input == "end") break;
        try {
            heights.push_back(std::stoi(input));
        }
        catch (std::invalid_argument e) {
            cout << "\nPlease enter an integer: ";
        }
    }
}

0
投票
if (string(typeid(height).name()) == "i")

您错了是指针和字符串的比较。因为typeid(height).name()返回一个指向带有对象名称的c字符串的指针。

© www.soinside.com 2019 - 2024. All rights reserved.