Я пытаюсь вставить элемент в конце массива в C ++. Почему этот подход не работает? - PullRequest
0 голосов
/ 07 марта 2020
int main()
{
    const int SIZE = 100;
    int a[SIZE];
    int input, capacity = 0;
    cout << "ENter Values. Press Q to quit: " << endl;
    while (cin >> input)
    {
        if (capacity < SIZE)
        {
            a[capacity] = input;
            capacity++;
        }
    }

    int element;
    cout << "enter element to be inserted : " << endl;
    cin >> element;
    if (capacity < SIZE)
    {
        capacity++;
        a[capacity - 1] = element;
    }

    for (int i = 0; i < capacity; i++)
    {
        cout << a[i] << endl;
    }
}

Когда я использую этот подход, после ввода значений программа непосредственно печатает массив (с дополнительным элементом). Программа никогда не дает возможности ввести значение элемента. Почему это происходит?

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Когда следующие l oop прерываются,

while (cin >> input)
{
   ...
}

нечего читать из cin или cin в состоянии ошибки. Следовательно, попытка чтения из cin завершается неудачно в строке

cin >> element;

. Поэтому программа переходит прямо к следующей строке.


Для решения проблемы

  1. Вырвитесь из while l oop после того, как прочитали SIZE количество элементов.

  2. Вырвитесь из while l oop, введя неверный ввод. В этом случае вам придется очистить состояние cin, отменить строку ввода, а затем продолжить.

Вы можете выполнить sh, используя оба.

while (capacity < SIZE && cin >> input)
{
    a[capacity] = input;
    capacity++;
}

// Did the while loop stop because of size or bad input?
if ( capacity < SIZE )
{
    // Bad input.
    // Clear the state of cin.
    // Read and discard the rest of the line.
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

Теперь вы можете продолжать читать с cin.

PS

Добавить

#include <limits>

, чтобы быть возможность использовать std::numeric_limits.

0 голосов
/ 07 марта 2020
int input, capacity = 0;
cout << "ENter Values. Press Q to quit: " << endl;
while (cin >> input)
{
 ...

Переменная input объявлена ​​как целое число, и вы используете ее для хранения значений, вводимых с консоли. Это будет хорошо работать при условии, что значение является только целым числом. Как только вы вводите «Q» или что-то еще, кроме числа, входной поток (cin) переходит в состояние ошибки, и введенное значение остается в буфере, но не сохраняется в input.

Вам нужно очистить состояние ошибки:

cin.clear();

и игнорировать все, что осталось в буфере и новой строке:

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

для восстановления после ошибки и продолжайте принимать ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...