getline() не работает должным образом

Привет, у меня неизвестная проблема с 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;
}

person user3558697    schedule 29.10.2014    source источник
comment
cin, вероятно, находится в состоянии сбоя, опубликуйте полный пример.   -  person user657267    schedule 29.10.2014
comment
вся программа размещена по запросу   -  person user3558697    schedule 29.10.2014
comment
возможный дубликат метода C++ getline не работает   -  person Retired Ninja    schedule 29.10.2014
comment
getStudents(students); - это неопределенное поведение, вы не инициализировали students. То же самое для quizzes. Вам даже не нужно передавать аргументы этим функциям.   -  person user657267    schedule 29.10.2014
comment
инициализировать их внутри функции? я только что инициализировал их в main до 0, и у меня такая же проблема   -  person user3558697    schedule 29.10.2014
comment
@user3558697 user3558697 Это не инициализация, это назначение. Но вы передаете students в качестве параметра, когда он не инициализирован.   -  person    schedule 29.10.2014
comment
@user3558697 user3558697 это не настоящая основная причина вашей проблемы, но пока вы не исправите неопределенное поведение, ваша программа бесполезна.   -  person user657267    schedule 29.10.2014
comment
@user657267 user657267 Я создал прототип функций выше main, если вы это имеете в виду, они обе верны. если это не то, что вы имеете в виду, я не уверен, что понимаю, что вы говорите.   -  person user3558697    schedule 29.10.2014
comment
Параметры используются для отправки данных в функции. getStudents не использует значение, отправленное в параметре student. Это должна быть локальная переменная.   -  person Neil Kirk    schedule 29.10.2014
comment
Почему учащиеся жестко установлены на 50, а тесты распределяются динамически, но произвольно установлены на максимум 10? Используйте векторы и измените их размер в соответствии с входным значением.   -  person Neil Kirk    schedule 29.10.2014
comment
Вы смешиваете ввод на основе строк с >>, если вы не убедитесь, что используете оставшиеся символы конца строки, у вас будут плохие времена.   -  person user657267    schedule 29.10.2014


Ответы (1)


Чтение отдельных значений из потока, подобного этому

cin >> quizzes;

не потребляет символ конца строки (или любые другие недопустимые символы, которые остались после попытки чтения quizzes), поэтому следующий вызов getline продолжит чтение с той же строки ввода (обычно вы ожидаете, что строка будет пусто после чтения quizzes, поэтому getline ничего не читает).

Ваша программа должна работать, если после прочтения quizzes использовать следующее:

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

или вы можете просто прочитать studentName так же, как и другие значения

std::cin >> studentName;

Как и при всех вызовах operator>>, удаляются все начальные пробелы, включая символы новой строки.

person user657267    schedule 29.10.2014