为什么此代码会在此时退出?

时间:2015-09-02 21:50:10

标签: 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"
         << ">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;。之后的其余部分不是我打算做的,但我只是用那部分来了解周围发生的事情。

PS:我知道还有其他方法可以改进整个事情,但我正在根据我目前的知识编写代码,并希望保持我目前正在实施的想法。如果现在不改变,我将不胜感激。我只需要知道我正在做的事情就是让代码在那时结束。

2 个答案:

答案 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;之前回答;这将解决问题。但是你没有控制输入。它只是用尽了... ..