Как работает часть программы?

208
15 ноября 2021, 12:00
while (!(cin >> number) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n')
            ;
    cout << "Ошибка ввода. Введите заново:`введите сюда код` " << endl;
}

Не могу понять как он работает, что делают cin.peek(), !(cin >> a), cin.clear(), cin.get() Помогите разобраться.

С++

Answer 1
  • cin.peek() _ возвращает целочисленное представление следующего символа в буфере потока, не прочитав его

  • (cin >> a) при вводе значения a, если все нормально, то выражение вернет true, соответственно !(cin >> a) вернет false (неудачу)

  • cin.clear() очистит все биты и установит бит по умолчанию (std::ios_base::goodbit), таким образом приведя поток в рабочее состояние.

  • cin.get() считывает один символ, но нигде не хранит

Таким образом имеем следующее:

while (!(cin >> number) || (cin.peek() != '\n'))

Пока попытка вводить с консоли значение number завершилась неудачей, или символ, следующий за последным прочитанным, не является '\n'(строка не закончилась). (Чушь какая то написана) {

    cin.clear();

очищаем cin, приводим его в рабочее состояние (установится состояние good)

    while (cin.get() != '\n');

Читаем всю оставшуюся строку посимвольно(т.е. пока не встретим '\n')

    cout << "Ошибка ввода. Введите заново:`введите сюда код` " << endl;
}

выводим на консоль сообщение об ошибке.

Вообшем написано плохо(ради чего вся остальная строка пропускается, непонятно), такой код нужно писать как: вводим число, если это не число или cin сломался по другой причине, поток приводим в рабочее состояние и игнорируем всю строку.

Answer 2

cin - это входной поток.
cout - это выходной поток.
cerr - это поток вывода сообщений об ошибках.

Для работы с этими операторами есть специальные поразрядные сдвиги:
>> - прочитать из входного потока.
<< - записать в выходной поток

От суда вывод, что cin - это ввод, из данного потока - читается последовательность символов до пробела и после помещается в идентификатор (переменную).

char c;
cin >> c;

Допустим, если взять строку состоящую из 2 и более слов, разделенными: пробелом, переводом строки, табуляцией, к примеру Тут Текст:

char s[10];
cin >> s;
cout << s << endl;

Вернет Тут.
Чтобы нам получить всю строку, нужно использовать манипулятор getline.

char s[10];
cin.getline(s, 10);
cout << s << endl;

Вернет Тут Текст.

Так-же поддерживается мульти-ввод:

cin >> var1 >> var2 >>...>> varN;
READ ALSO
C++ Динамический Массив

C++ Динамический Массив

Не очень понимаю как реализовать динмассив на CPP

157
error C2664 cannot convert argument 1 from &#39;const wchar_t [9]&#39; to &#39;TCHAR *&#39;

error C2664 cannot convert argument 1 from 'const wchar_t [9]' to 'TCHAR *'

Прекрасно компилируется в codeblocks а в Visual studio выдает

345
Фильтрация дискретного сигнала

Фильтрация дискретного сигнала

На фото есть кривая, которая в общем случае через каждые Δx состоит из двух точек (в реальности это координаты двух рядом проложенных проводов)

97
Использование 64-bit кода и 32-bit данных

Использование 64-bit кода и 32-bit данных

Какие преимущества дает использование 64-bit кода и 32-bit данных?

157