我正在学习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语句?还是我在这里遇到的问题?
提前感谢!
我建议抓住绳子。如果字符串不是“ end”,则在try / catch内转换为数字
您可以在程序fflush(stdin)的开始使用此功能。它将清除您的输入缓冲区。
您正在尝试在同一行代码中读取int
和string
。我建议您使用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: ";
}
}
}
if (string(typeid(height).name()) == "i")
您错了是指针和字符串的比较。因为typeid(height).name()返回一个指向带有对象名称的c字符串的指针。