getline()未按预期工作

getline() not working as intended

本文关键字:工作 getline      更新时间:2023-10-16

嗨,我的getline()出现未知问题。我的程序应该定制一个提示,然后getline()应该读取用户输入,但由于某种原因,每次我运行它时,它只定制提示并跳到下一个提示符,不允许我输入任何内容。我会发布代码,希望你们能提供一些建议。

int main()
{
    int students = 0;
    students = getStudents(students);
    int quizzes = 0;
    quizzes = getQuizzes(quizzes);
    string studentArray[50];
    int* quizArray = new int[quizzes];
    double* studentAverage = new double[students];
    string studentName = "";
    for(int i = 0; i < students; i++)
    { 
        cout << "Enter the students name: ";
        getline(cin, studentName);
        studentArray[i] = studentName;
        cout << studentName;
        for(int j = 0; j < quizzes; j++)
        {
            cout << "Enter quiz " << j+1 << ":";
            cin >> quizArray[j];
        }
        studentAverage[i] = calculateAvergage(quizArray,quizzes);
        cout << studentArray[i];
        cout << studentName;
    }
    cout << endl;
    cout << "Student              Quiz Average" << endl << endl;
    cout << "---------------------------------" << endl << endl;

    for(int i = 0; i < students; i++)
    {
        cout << studentArray[i];
        cout << setw(10) << studentAverage[i] << endl << endl;
    }   
}
int getStudents(int students)
{
    cout << "How many students?  ";
    cin >> students;
    cout << endl;
    if(students > 50)
    {
        cout << "Invalid number of students, enter a number less than 50: ";
        cin >> students;
        cout << endl;
    }
    return students;
}
int getQuizzes(int quizzes)
{
    cout << "How many quizzes?  ";
    cin >> quizzes;
    cout << endl;
    if(quizzes > 10)
    {
        cout << "Invalid number of quizzes, enter a number less than 10: ";
        cin >> quizzes;
        cout << endl;
    }
    return quizzes;
}
double calculateAvergage(int quiz_array[],int num_quizzes)
{
    double average = 0;
    for(int i = 0; i < num_quizzes; i++)
    {
        average = quiz_array[i] + average;
    }
    average = (average/num_quizzes);
    return average;
}

从类似的流中读取单个值

cin >> quizzes;

不使用行的末尾字符(或尝试读取quizzes后留下的任何其他无效字符),因此对getline的下一次调用将继续从同一行输入中读取(通常您会期望在读取quizzes后该行为空,因此getline最终什么都不读取)。

如果在阅读quizzes:后使用以下内容,您的程序应该可以工作

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

或者你可以简单地以与其他值相同的方式读取studentName

std::cin >> studentName;

与所有对operator>>的调用一样,这会去掉所有前导空格,包括换行符。