C ++ CIN Cin случайно пропускает - PullRequest
2 голосов
/ 06 апреля 2010

У меня есть эта программа, но cin in случайно пропускает .. Я имею в виду, иногда это происходит, а иногда нет.Есть идеи как это исправить?

    int main(){ 


        /** get course name, number of students, and assignment name **/
        string course_name;
        int numb_students;
        string assignment_name;
        Assignment* assignment;

        cout << "Enter the name of the course" << endl;
        cin >> course_name;

        cout << "Enter the number of students" << endl;
        cin >> numb_students;   

        cout << "Enter the name of the assignment" << endl;
        cin >> assignment_name;

        assignment = new Assignment(assignment_name);

        /** iterate asking for student name and score **/
        int i = 0;
        string student_name;
        double student_score = 0.0;
        while( i < numb_students ){

            cout << "Enter the name for student #" << i << endl;
            cin >> student_name;
            cout << "Enter the score for student #" << i << endl;
            cin >> student_score;
            assignment->addScore( Student( student_name, student_score ));
            i++;
        }
}

ОК Я разобрался.Для тех, кто хотел бы знать, вот обновленный код:

int main(){ 

    /** get course name, number of students, and assignment name **/
    string course_name;
    int numb_students;
    string assignment_name;

    cout << "Enter the name of the course" << endl;
    getline(cin, course_name);

    cout << "Enter the number of students" << endl;
    string temp;
    getline(cin, temp);
    numb_students = atoi(temp.c_str());

    cout << "Enter the name of the assignment" << endl;
    getline(cin, assignment_name);

    Assignment assignment(assignment_name);

    /** iterate asking for student name and score **/
    int i = 0;
    string student_name;
    double student_score = 0.0;
    while( i < numb_students ){

        cout << "Enter the name for student #" << i+1 << endl;
        getline(cin, student_name);     
        cout << "Enter the score for student #" << i+1 << endl;
        getline(cin, temp);
        student_score = atof(temp.c_str());
        assignment.addScore( Student( student_name, student_score ));
        i++;
    }

1 Ответ

5 голосов
/ 06 апреля 2010

Я бы предположил, что в некоторых ваших входах есть пробелы, которые оператор >> обрабатывает как конец определенного элемента ввода. Оператор iostreams >> действительно не предназначен для интерактивного ввода, особенно для строк - вам следует рассмотреть возможность использования getline ().

Кроме того, вы без необходимости используете динамическое распределение:

assignment = new Assignment(assignment_name);

было бы намного лучше записать как:

Assignment assignment(assignment_name);

вам следует избегать использования 'new' в вашем коде везде, где это возможно, и вместо этого позволить компилятору позаботиться о времени жизни объекта для вас.

...