путающий синтаксис cin.get()

-4

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

#include <iostream>
using namespace std;

int main()
{
char array[10];
int character;
cin.get(array, 10, 'a');
cout << endl << array << endl;
cout << cin.eof() << endl;
cin.get(array, 10, 'a');
cout << "not ignored: " << array << endl;

cin.ignore();
cin.get(array, 10,'a');
cout << "ignored: " << array << endl;

while((character=cin.get())!=EOF){}
cout << character << endl;
cout << cin.eof() << endl;
}

Затем я набираю "Майами - город (Enter)" в терминале, получаю следующие результаты:

Mi
0
not ignored:
ignored:
-1
0

Я не имею в виду несколько моментов. Я не вводил "EOF", но символ имеет значение "-1". Я думаю, это может быть, что второй cin.get(array, 10, 'a'); получить пустую строку, она просто рассматривает ее как "EOF"? Я прав? Если это так, то имеет смысл, что никакие другие символы не следует "игнорируются". Но если да, то почему последнее выражение выдает "0"? Благодарю!

спросил(а) 2021-01-25T14:48:27+03:00 4 месяца, 4 недели назад
1
Решение
100

С http://en.cppreference.com/w/cpp/io/basic_istream/get

Если никакие символы не были извлечены, вызовы setstate(failbit). В любом случае, если count>0, нулевой символ (CharT() сохраняется в следующем последовательном расположении массива.

Поскольку во втором вызове никаких символов не было извлечено

cin.get(array, 10, 'a');

failbit. Вам нужно очистить состояние, прежде чем вы сможете читать больше символов из строки.

Рабочий код:

#include <iostream>
using namespace std;

int main()
{
char array[10];
int character;
cin.get(array, 10, 'a');
cout << endl << array << endl;
cout << cin.eof() << endl;

cin.get(array, 10, 'a');
// failbit is set since no characters were extracted in the
// above call.

cout << "not ignored: " << array << endl;

// Clear the stream
cin.clear();

cin.ignore();
cin.get(array, 10,'a');
cout << "ignored: " << array << endl;

while((character=cin.get())!=EOF){}
cout << character << endl;
cout << cin.eof() << endl;
}

ответил(а) 2021-01-25T14:48:27+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема