Программирование. Принципы и практика использования C++ Исправленное издание, стр. 161
идти налево, пока не увидишь картину справа на стене
сними картину со стены и открой дверь позади нее. Возьми сундук
В данном случае мы сначала прочитаем всю строку, а затем извлечем из нее отдельные слова.
string command;getline(cin,command); // вводим строкуstringstream ss(command);vector<string> words;string s;while (ss>>s) words.push_back(s); // извлекаем отдельные словаС другой стороны, если есть выбор, то лучше всего ориентироваться на знаки пунктуации, а не на символ перехода на новую строку.
11.6. Классификация символов
Как правило, мы вводим целые числа, числа с плавающей точкой, слова и так далее, в соответствии с общепринятым форматом. Однако мы можем, а иногда и должны, снизить уровень абстракции и ввести отдельные символы. Для этого необходимо затратить больше усилий, но, считывая отдельные символы, мы получаем полный контроль на тем, что делаем. Рассмотрим задачу распознавания лексем в выражениях из раздела 7.8.2.
Допустим, мы хотим разделить выражение
1+4*x<=y/z*51 + 4 * x <= y / z * 5Для ввода чисел мы могли бы использовать оператор
>>x<=y<=z**Вместо этого можно сделать следующее:
char ch;while (cin.get(ch)) { if (isspace(ch)) { // если символ ch является разделителем, // ничего не делаем (так как разделители // игнорируются) } if (isdigit(ch)) { // вводим число } else if (isalpha(ch)) { // вводим идентификатор } else { // обрабатываем операторы }}Функция
istream::get()>>get()istreamПри вводе отдельных символов мы обычно хотим классифицировать их: это символ или цифра? В верхнем регистре или в нижнем? И так далее. Для этого существует набор стандартных библиотечных функций.

Обратите внимание на то, что категории классификации можно объединять с помощью оператора ИЛИ (
||isalnum(c)isalpha(c)||isdigit(c);Кроме того, в стандартной библиотеке есть две полезные функции для уничтожения различий между символами, набранными в разных регистрах.

Это удобно, когда мы хотим устранить различия между символами, набранными в разных регистрах. Например, если пользователь ввел слова
RightrightrigHTrigHTtolower()rightstringvoid tolower(string& s) // вводит строку s в нижнем регистре{ for (int i=0; i<s.length(); ++i) s[i] = tolower(s[i]);}
stringtolower()toupper()11.7. Использование нестандартных разделителей
В этом разделе мы рассмотрим гипотетические примеры использования потоков i
ostreamistream>>As planned, the guests arrived; then
то получали слова
Asplanned,