Что завершает чтение ввода в int

0

Я изучаю C++, используя книгу: Принципы программирования и практику с использованием C++. В конце главы 3 автор спрашивает, что заканчивает чтение ввода в int, я думал, что чтение ввода во вход завершается, когда вы вводите пробел так же, как тип строки, но после написания этой программы у меня есть некоторые сомнения:

constexpr double cm_per_inch = 2.54; 
double lenght = 1; 

char unit = 0; 
cout << "Please enter a lenght followed by a unit (c or i):\n"; 
cin >> lenght >> unit; 

if (unit == 'i')
cout << lenght << "in == " << cm_per_inch * lenght << "cm\n";

else
cout << lenght << "cm == " << lenght / cm_per_inch << "in\n"; 

Здесь, если я войду в ввод, 1i cin будет читать 1 в длину и я в единицу, почему? не следует ли использовать пробел для завершения чтения в int? Что не так?

  • 1
    все сводится к тому, что ОС воспринимает как завершение ввода. cin просто собирается передать управление механизмам ввода операционной системы os и ждать какого-нибудь символа EOL. например, возврат каретки
  • 0
    Я предполагаю, что имелось ввиду ввод данных во входной буфер, что вызывает остановку в прохождении через буфер, а не то, что заставляет вводимый вами ввод фактически передаваться программе.
Показать ещё 1 комментарий
Теги:

4 ответа

3
Лучший ответ

Оператор >> на cin знает тип переменной, которую он пытается извлечь и проанализировать. В вашем случае cin читает со стандартного ввода, пока оставшиеся байты продолжают составлять целое число. Как только встречается какой-либо нецелый символ, cin делается для чтения в целых числах. Барьеры, которые определяют, когда выполняется синтаксический анализ, различаются в зависимости от того, какую переменную вы пытаетесь извлечь из оператора >> на цинке. num_get :: get - это то, что оператор >> на цине внутренне вызывает для анализа переменных на основе ожидаемого формата.

Вот ссылка на ссылку о операторе >>, который реализует cin (он подробно описывает): http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

  • 0
    Это неправильно: These "sentries" vary depending on what type of variable you are attempting extract through the >> operator on cin.
  • 0
    Поведение часового варьируется в зависимости от того, какой тип данных извлекается.
Показать ещё 2 комментария
1

Ввод в строку завершается пробелом, т.е. Пробелом, символом новой строки и символами табуляции. Ввод в целое число завершается любым нечисловым символом.

1

Для завершения ввода строки вам нужно пробел, который является пространством, новой строкой и табулятором.
(См. Стр. 64)

Чтобы закончить двойной, вы можете ввести все, что не является допустимым двойным значением.
(См. Стр. 121)

Чтобы завершить цикл, вам нужен шейкер конца ввода:
Windows: [Ctrl] + [Z]
Linux: [Ctrl] + [D]
(См. Стр. 72)

1

Механизм входного потока ограничивает ввод не только в пробелах или в конце файла, но и для любого символа, который не соответствует требованиям форматирования для считываемого типа. Когда вы используете оператор >> для целого числа, поток делегирует форматирование классу "facet", который содержит информацию, специфичную для обработки форматирования для int s. Когда фасет находит символ, который не может перейти в целое число, он перестает считывать и сохраняет все, что было прочитано до сих пор в считываемом целое.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню