Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Проблемы, возникающие при вводе строкСодержание книги
Поиск на нашем сайте
Успешно выполнив все описанные ранее операции с объектом cin, вы будете неприятно удивлены, если попытаетесь ввести в строке полное имя. Дело в том, что cin рассматривает пробел как заданный по умолчанию разделитель строк. После того как в строке обнаруживается пробел, ввод строки завершается добавлением концевого нулевого символа. Эта проблема показана в листинге 16.2. Листинг 16.2. Попытка ввода бодев одного сша с помощьм cin 1: //Листинг 16.2. Проблемы с вводом строки с помощью cin 2: 3: #include <iostream.h> 4: 5: int main() 6: { 7: char YourName[50]; 8: cout << "Your first name: "; 9: cin >> YourName; 10: cout << "Here it is: " << YourName << endl; 11: cout << "Your entire name: "; 12: cin >> YourName; 13: cout << "Here it is: " << YourName << endl; 14: return 0; 15: }
Результат: Your first name: Jesse Here it is: Jesse Your entire name: Jesse Liberty Here it is: Jesse
Анализ: Строкой 7 для хранения вводимой пользователем строки создается массив символов. В строке 8 пользователю предлагается ввести имя, и, как видно из вывода, это имя сохраняется правильно. В строке 11 пользователю предлагается ввести не только имя, но и фамилию. Ввод осуществляется только до тех пор, пока cin не обнаружит пробел между именем и фамилией. После этого ввод строки прекращается и оставшаяся информация теряется. Это не совсем то, что было нужно. Чтобы понять, почему cin работает именно так, проанализируйте листинг 16.3, в котором показан пример ввода строки значений. Листинг 16.3. Ввод строки значений 1: //Листинг 16.3. Ввод строки значений с помощью cin 2: 3: #include <iostream.h> 4: 5: int main() 6: { 7: int myInt; 8: long myLong; 9: double myDouble; 10: float myFloat; 11: unsigned int myUnsigned; 12: char myWord[50]; 13: 14: cout << "int: "; 15: cin >> myInt; 16: cout << "Long: "; 17: cin >> myLong; 18: cout << "Double: "; 19: cin >> myDouble; 20: cout << "Float: "; 21: cin >> myFloat; 22: cout << "Word: "; 23: cin >> myWord; 24: cout << "Unsigned: "; 25: cin >> myUnsigned; 26: 27: cout << "\n\nInt:\t" << myInt << endl; 28: cout << "Long:\t" << myLong << endl; 29: cout << "Double:\t" << myDouble << endl; 30: cout << "Float:\t" << myFloat << endl; 31: cout << "Word: \t" << myWord << endl; 32: cout << "Unsigned:\t" << myUnsigned << endl; 33: 34: cout << "\n\nInt, Long, Double, Float, Word, Unsigned: "; 35: cin >> myInt >> myLong >> myDouble; 36: cin >> myFloat >> myWord >> myUnsigned; 37: cout << "\n\nInt:\t" << myInt << endl; 38: cout << "Long:\t" << myLong << endl; 39: cout << "Double:\t" << myDouble << endl; 40: cout << "Float:\t" << myFloat << endl; 41: cout << "Word: \t" << myWord << endl; 42: cout << "Unsigned:\t" << myUnsigned << endl; 43: 44: 45: return 0; 46: } Результат: Int: 2 Long: 30303 Double: 393939397834 Float: 3.33 Word: Hello Unsigned: 85 Int: 2 Long: 30303 Double: 3.93939e+11 Float: 3.33 Word: Hello Unsigned: 85 Int, Long. Double, Float, Word, Unsigned: 3 304938 393847473 6.66 bye -2 Int: 3 Long: 304938 Double: 3.93847e+08 Float: 6.66 Word: bye Unsigned: 4294967294 Вновь в программе объявляются переменные разных типов и массив символов. Пользователю предлагается последовательно ввести данные разных типов, чтобы убедиться что программа поддерживает ввод данных любого типа. Анализ: В строке 34 пользователю предлагается ввести все данные сразу в определенном порядке, после чего каждое введенное значение присваивается соответствующей переменной. Благодаря тому что cin рассматривает пробелы между словами как разделители, становится возможной инициализация всех переменных. В противном случае программа пыталась бы ввести всю строку в одну переменную, что было бы ошибкой. Обратите внимание на строку 42, в которой выводится без знаковое целое число. Пользователь ввел значение -2. Поскольку программа была проинструктирована, что вводится без знаковое целое число, то вместо знакового -2 будет введено без знаковое двоичное представление этого числа. Поэтому при выводе с помощью cout на экране отображается значение 4294967294, являющееся двоичным представлением числа -2. Позже вы узнаете, как вводить в буфер строки, содержащие несколько слов, разделенных пробелами. Сейчас же рассмотрим подробнее использование cin для ввода данных сразу в несколько переменных, как в строках 35-36.
Оператор >> возвращает ссылку на объект istream
Оператор >> возвращает ссылку на объект istream. Но поскольку cin сам является объектом istream, результат выполнения одной операции ввода может быть началом следующей операции ввода, как показано ниже: Int Var0ne, varTwo, varThree; cout << "Enter three numbers: " cin >> Var0ne >> varTwo >> varThree; В строке cin >> VarOne >> varTwo >> varThree; сначала выполняется первый ввод cin >> VarOne, в результате чего возвращается объект istream, позволяющий выполнить присвоение второго значения переменной varTwo. Это равносильно следующей записи: ((cin >> VarOne) >> varTwo) >> varThree; Аналогичный подход используется с объектом cout, но речь об этом пойдет дальше.
Другие методы объекта cin
В дополнение к перегружаемому оператору >> объект cin имеет множество других встроенных методов. Они используются в тех случаях, когда необходим более совершенный контроль над вводом данных. Ввод одного символа
Вариант operator>>, принимающий ссылку на символ, может использоваться для считывания одного символа со стандартного устройства ввода. Для этого используется функция-член get(). При этом можно применять get() без параметров или использовать вариант этой же функции, принимающей в качестве параметра ссылку на символ.
|
||||
Последнее изменение этой страницы: 2016-12-10; просмотров: 382; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.83.149 (0.008 с.) |