Что я не понимаю о строках getline +? - PullRequest
11 голосов
/ 23 ноября 2011

Я впервые использую stackoverflow. Я не смог найти нужную мне информацию о getline. Я нахожусь в простом классе программирования для инженерных переводов, поэтому код, который мы пишем, довольно прост. Все, что я пытаюсь сделать здесь, это поместить определенное пользователем количество вопросов и ответов в два разных массива. Мой цикл while выглядит следующим образом (я использовал цикл for, но переключился на while, чтобы посмотреть, перестанет ли он прерываться):

int main ()
{
    srand((unsigned)time(0));
    string quest1[100], answ1[100];
    int size1, x = 0, num, count1, visit[100], shuffle[100];
    fstream flashcard1; 

    cout << "flashcard.cpp by NAME\n" << endl;
    cout << "This program allows user to manipulate questions and answers for studying.\n" << endl;
    cout << "\nHow many flash cards will be entered(MAX 100)? ";
    cin >> size1;
    cout << endl;

    while(x < size1)
    {
        cout << "Enter Question: ";
        getline(cin , quest1[x]);
        cout << endl;
        x = x++;

        /*
        cout << "Enter Answer: " << endl;
        getline(cin,answ1[x]);
        cout << endl;
        flashcard1.open("flashcard1.dat", ios::app);
        flashcard1 << quest1[x] << " " << answ1[x] << endl;
        flashcard1.close();
        cout << "Data Stored." << endl;
        */
    }
}

Я отметил часть ввода ответа, а также сохранение данных в файл только для отладки. Когда я запускаю программу, она пропускает getline для первого вопроса, отображает второй цикл «Ввести вопрос», и getline работает для остальных из них. Поэтому, если у меня размер 1 из 5, программа заполняет только позиции массива 1-4. Пожалуйста помоги. Это простая программа для работы с флэш-картами, которая будет делать то же самое, как если бы вы создавали флэш-карты для изучения и перемешивания их.

1 Ответ

13 голосов
/ 23 ноября 2011

Причина, по которой кажется, что вы пропускаете первую итерацию, заключается в том, что когда вы делаете

cin >> size1;

Вы вводите число и нажимаете клавишу Enter. cin читает целое число и оставляет символ новой строки непрочитанным в буфере , поэтому при вызове getline все равно, что вы сразу нажали клавишу ввода, а getline ничего не читает (потому что останавливается перед прочтением символа новой строки), сбрасывает новую строку и помещает пустую строку в quest1[0]. И именно поэтому остальные getline работают "правильно".

Добавьте cin.ignore('\n') над циклом, чтобы избавиться от затяжного '\n', и это должно заставить его работать, исключая другие ошибки в вашем коде.

И не забудьте изменить x = x++ на x++, чтобы избежать UB.

...