我是C ++的新手。我偶然发现了一个教程问题,我想我会用我学到的一些东西来解决它。我已经编写了一定程度的代码,但代码退出了一点,我真的无法弄清楚原因。我不想详细讨论教程问题,因为我实际上希望根据我从一开始就理解它的方式继续使用它,并且我知道未来的回答者可能想要改变它。代码是解释性的,我刚写了几行。
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
double average_each_student() {
cout << "\n>Enter your scores seperated by spaces and terminated with a period\n"
<< ">Note: scores after total number of six will be truncated.\n"
<< endl;
double sum = 0, average = 0;
int user_input, counter = 0;
const double no_of_exams = 6;
while(cin >> user_input) {
++counter;
if(counter < 5) sum += 0.15 * user_input;
else if(counter > 4 && counter < 7) sum += 0.20 * user_input;
}
return sum / no_of_exams;
}
int reg_number() {
cout << "Enter your registration number: " << endl;
int reg_numb;
cin >> reg_numb;
return reg_numb;
}
int main() {
vector<int> reg_num_list;
vector<double> student_average;
reg_num_list.push_back(reg_number());
student_average.push_back(average_each_student());
string answer;
cout << "\n\nIs that all??" << endl;
//everything ends at this point.
//process returns 0
cin >> answer;
cout << answer;
}
代码退出cout << "\n\nIs that all??" << endl;
。之后的其余部分不是我打算做的,但我只是用那部分来了解周围发生的事情。
答案 0 :(得分:3)
average_each_student()
内的循环一直运行,直到数据的进一步输入失败并且std::cin
进入失败状态(即设置为std::ios_base::failbit
)。
结果,main()
中的输入立即失败,输入的输出只打印未更改的字符串。也就是说,您对输入之前存在的程序的感知实际上是错误的:它只是不等待处于失败状态的流上的输入。由于您的输出没有添加任何可识别的内容,因此输出似乎无效,尽管它实际上打印了一个空字符串。您可以通过添加内容轻松验证此声明,例如
std::cout << "read '" << answer << "'\n";
是否可以从输入流上的失败状态恢复取决于它的失败方式。如果您输入数字,直到您指示流终止(在终端上使用Ctrl-D或Ctrl-Z取决于您使用的系统类型),则无法恢复任何方式。如果您终止输入非数字的输入,则可以使用
std::cin.clear();
清除流声明的失败。您可能希望使用
忽略输入的字符std::cin.ignore(); // ignore the next character
或
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// ignore everything up to the end of the line
答案 1 :(得分:-1)
使用cin.clear();在cin&gt;之前回答;这将解决问题。但是你没有控制输入。它只是用尽了... ..