Я изучаю 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? Что не так?
Оператор >> на cin знает тип переменной, которую он пытается извлечь и проанализировать. В вашем случае cin читает со стандартного ввода, пока оставшиеся байты продолжают составлять целое число. Как только встречается какой-либо нецелый символ, cin делается для чтения в целых числах. Барьеры, которые определяют, когда выполняется синтаксический анализ, различаются в зависимости от того, какую переменную вы пытаетесь извлечь из оператора >> на цинке. num_get :: get - это то, что оператор >> на цине внутренне вызывает для анализа переменных на основе ожидаемого формата.
Вот ссылка на ссылку о операторе >>, который реализует cin (он подробно описывает): http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/
These "sentries" vary depending on what type of variable you are attempting extract through the >> operator on cin.
Ввод в строку завершается пробелом, т.е. Пробелом, символом новой строки и символами табуляции. Ввод в целое число завершается любым нечисловым символом.
Для завершения ввода строки вам нужно пробел, который является пространством, новой строкой и табулятором.
(См. Стр. 64)
Чтобы закончить двойной, вы можете ввести все, что не является допустимым двойным значением.
(См. Стр. 121)
Чтобы завершить цикл, вам нужен шейкер конца ввода:
Windows: [Ctrl] + [Z]
Linux: [Ctrl] + [D]
(См. Стр. 72)
Механизм входного потока ограничивает ввод не только в пробелах или в конце файла, но и для любого символа, который не соответствует требованиям форматирования для считываемого типа. Когда вы используете оператор >>
для целого числа, поток делегирует форматирование классу "facet", который содержит информацию, специфичную для обработки форматирования для int
s. Когда фасет находит символ, который не может перейти в целое число, он перестает считывать и сохраняет все, что было прочитано до сих пор в считываемом целое.