2013-08-02 2 views
2

Мой код читает неопределенное количество целых чисел, по два за раз: while (cin>>a>>b).Разрыв Cpp-петли с "|"

Я хочу, чтобы цикл прерывался, когда | вводится и присваивается либо a, либо b.

a и b оба должны быть объявлены как int. Я бы тогда сравнить: a или b==int('|')

Defining «а» и «б», как char типа первоначально, позволил мне юбку проблемы, но не идеально.

Это глава 4 дрель в Stroustrup's Принципы и практика с использованием C++ (стр. 124).

Я думаю, что я понимаю, что чтение | в переменную int пытается преобразовать string в int (неприемлемо?). Строуструп говорит, чтобы использовать персонажа, чтобы закончить цикл в его упражнении, но он не объясняет, как он использовал его раньше, когда упоминал об этом в книге. Есть ли способ использовать символ |, если требуется, используя только базовый код, обсуждаемый до этого момента в книге? Спасибо заранее.

+2

Символа '|' не является допустимым число , поэтому вход будет терпеть неудачу, и ваш цикл сломается. Однако он не будет присваиваться 'a' или' b'. Если вы хотите обрабатывать нецелый текст, вам нужно прочитать строку или символ. – paddy

+2

Нет, '|' на самом деле просто не 'int'. (Возможно, есть 'boost :: glyph_cast', который вернет' 1'. Я не просмотрел его.) – Potatoswatter

+0

Итак, '|' ** предназначен ** для отказа в качестве входа для разрыва цикла? Ха-ха. Ну, это было весело, пытаясь обработать его весь день. Спасибо вам обоим. – James

ответ

4

Нет необходимости использовать какой-либо конкретный символ - любой нечисловой символ без пробелов разбивает цикл.

Когда cin >> a >> b выполнено, оно, как вы знаете, считывает два целых числа, разделенных пробелами, в a и b, на заказ. Выражение возвращает объект cin, поэтому все выражение имеет значение cin. Это важно отметить.

Когда cin оценивается в логическом контексте (например, в if заявлении или while петли), это эквивалентно вызову !cin.fail(). То есть, cin будет оцениваться как true, когда поток находится в хорошем состоянии, но он принимает значение false при возникновении ошибки.

Когда cin пытается прочитать символ | в переменной int, операция не имеет смысла и, следовательно, не работает. cin затем устанавливает флаг сбоя. Поскольку флаг сбоя установлен, cin.fail() вернет true, а когда cin оценивается как логическое значение, он вычисляет false, и цикл завершается.

Следует отметить, что после того, как cin входит неисправность состояния, его состояние необходимо сбросить и любой непригодный вход отбрасывается, прежде чем cin может быть использован снова:

cin.clear(); // reset state flags 
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // discard all input up to next newline 
+0

Спасибо за разъяснение. Мне любопытно, есть ли способ использовать false 'cin' как условие in и' if' или 'switch', поэтому я могу вывести« loop broken »или что-то еще? – James

+0

@James: С 'if', да. «Переключатель» требует целостного выражения - которое производит числа, а не 'bool'. Таким образом, 'switch' с двумя возможными значениями (' 0' и 'default') не особенно полезен для' switch'. – greyfade

Смежные вопросы