Почему cin.ignore () игнорирует первый символ ввода getline? - PullRequest
1 голос
/ 03 апреля 2020

Итак, согласно Eclipse, функция getline сохраняет всю текстовую строку из потока вместе с символом новой строки и «завершающим нулевым символом». Я не совсем знаю, что это значит.

Вывод, который я пытаюсь получить, - это печать двух параллельных массивов с использованием функции. Эта функция является функцией void, содержащей 3 параметра, первый массив, второй массив и значение размера массива с постоянным целым числом.

Я могу без проблем сохранить входные данные в первом массиве.

    const int SIZE = 5;
    double firstArray[SIZE];

    // range-based `for` loop to get user input
    for (double& floatNum : firstArray)
    {
        cout << "Enter a floating point number: ";
        cin >> floatNum;
    } 

Однако со вторым массивом, который является строковым типом, все становится странным.

    string secondArray[SIZE];

    // `for` loop to get user input
    for (int i = 0; i < SIZE; i++)
    {
        cout << "Enter a name: ";
        cin.ignore();
        getline(cin, secondArray[i]);
    }

Мой желаемый вывод - распечатать оба массива с помощью вызова функции в main(), printParallel(array1, array2, sizeofarray), одновременно используя while l oop внутри функции, которую я попытался здесь:

void printParallel(double arrayOne[], string arrayTwo[], const int NUM)
{
    int i = 0;
    while (i < NUM)
    {
        cout << arrayOne[i] << " " << arrayTwo[i] << endl;
        i++;
    }

}

Но вывод слегка отключен:

Enter a floating point number: 1.23
Enter a floating point number: 1.23
Enter a floating point number: 1.23
Enter a floating point number: 1.23
Enter a floating point number: 1.23
Enter a name: AA AA
Enter a name: AA AA
Enter a name: AA AA
Enter a name: AA AA
Enter a name: AA AA
1.23 AA AA
1.23 A AA
1.23 A AA
1.23 A AA
1.23 A AA

Может кто-нибудь объяснит, что здесь происходит? Первая буква «А» перезаписывается нулевым символом. Кроме того, есть ли лучший способ, которым я должен задавать вопросы, чтобы лучше решать проблемы в будущем?

1 Ответ

0 голосов
/ 03 апреля 2020

Проблема:

cin.ignore(); внутри l oop

Это эквивалентно cin.ignore(1);

Он игнорирует каждый первый символ ваших строковых входов. Вот почему все эти "AA AA" становятся "A AA" (первое 'A' игнорируется cin.ignore()).

За исключением первого "АА АА" . В этом случае cin.ignore() фактически игнорирует \n после ввода последнего числа с плавающей запятой из предыдущего l oop. Итак, первый вывод строки, к счастью, правильный.

Решение:

Вызовите cin.ignore() только один раз перед вводом этого l oop вместо вызова его для каждого строковый ввод.

getline(cin, secondArray[i]); съедает \n в конце этих входов, и вам не нужно cin.ignore() их.

// `for` loop to get user input
cin.ignore(); // solution
for (int i = 0; i < SIZE; i++)
{
    cout << "Enter a name: ";
    // cin.ignore(); <-- Mistake
    getline(cin, secondArray[i]);
}
...