为什么这段代码会在此时退出? 我是C++新手。我偶然发现了一个辅导问题,我想我应该用我学过的几样东西来解决它。我已经编写了一定程度的代码,但代码在某一点上存在,我真的不知道为什么。我不想详细讨论教程问题,因为我实际上希望根据我从一开始对它的理解继续讨论,我知道未来的回答者可能希望改变这一点。代码是解释性的,我只写了几行
下面是代码:为什么这段代码会在此时退出? 我是C++新手。我偶然发现了一个辅导问题,我想我应该用我学过的几样东西来解决它。我已经编写了一定程度的代码,但代码在某一点上存在,我真的不知道为什么。我不想详细讨论教程问题,因为我实际上希望根据我从一开始对它的理解继续讨论,我知道未来的回答者可能希望改变这一点。代码是解释性的,我只写了几行,c++,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" <&l
#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;
}
#包括
#包括
#包括
使用名称空间std;
双倍平均每名学生(){
cout(用户输入){
++计数器;
如果(计数器<5)和+=0.15*用户输入;
否则,如果(计数器>4&&计数器<7)和+=0.20*用户输入;
}
返回总次数/考试次数;
}
整数注册号(){
不能麻木;
返回reg_numb;
}
int main(){
向量注册表号列表;
向量学生平均值;
reg_num_list.向后推(reg_number());
学生平均。推回(平均每个学生();
字符串回答;
答不上来;
cout内部的循环average\u each_student()
运行,直到进一步的数据输入失败,并且std::cin
进入失败状态(即,它获得std::ios\u base::failbit
set)
因此,在main()中输入
立即失败,输入内容的输出只打印未更改的字符串。也就是说,您对输入之前存在的程序的感知实际上是错误的:它只是不等待处于失败状态的流上的输入。由于您的输出没有添加任何可识别的内容,因此尽管它实际打印,但输出似乎什么也不做s是一个空字符串。您可以通过添加一些内容轻松验证此声明,例如
std::cout << "read '" << answer << "'\n";
若要清除流的失败,请声明。您可能希望使用忽略输入的字符
std::cin.ignore(); // ignore the next character
或
std::cin.ignore(std::numeric_limits::max(),'\n');
//忽略所有内容,直到行的末尾
使用cin.clear();在cin>>之前回答;这将解决问题。但您没有控制输入。它只是运行到cin。可能性:1。cin
处于错误状态。出现错误时,您无法读取cin
。cin>>回答;
立即返回并cout>>回答;
打印空字符串。2。cin>>reg_numb;
(以及其他数字读取)。要使其起作用,您必须按enter键。转换注册表项不会占用enter键,因此cin>>answer;
会立即感到满意,并在答案中放入一个空字符串。是的..谢谢..我在提问之前应该好好研究一下..我看到了另一个类似的问题,我认为解决方案是正确的(这显然和你的一样)也适用于这一点。我想这是一些重复。好吧,我现在明白了。cin.clear()和cin.ignore()的组合(我现在正在学习两者)解决了这个问题。平均每个学生()按预期使用非字符终止。在cin>>应答
之前,执行终止操作的非字符键和完成“在缓冲区中等待”功能的返回键可以工作。
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