Читаем Освой самостоятельно С++ за 21 день. полностью

28:   cout << "Unsigned:\t" <

29:   return 0;

30: }

Результат:

int: 2

Long: 70000

Double: 987654321

Float: 3.33

Unsigned: 25

Int: 2

Long: 70000

Double: 9.87654e+08

Float: 3.33

Unsigned: 25

Анализ: В строках 7—11 объявляются переменные разных типов. В строках 13—22 пользователю предлагается ввести значения для этих переменных, после чего результаты выводятся в строках 24—28 (с помощью cin).

Выводимая программой информация говорит о том, что переменные записываются и выводятся в соответствии с их типом.

<p>Строки</p></span><span>

Объект cin также может принимать в качестве аргумента указатель на строку символов (char*), что позволяет создавать буфер символов и заполнять его с помощью cin. Например, можно написать следующее:

char YourName[50]

cout << "Enter your name: ";

cin >> YourName;

Если ввести имя Jesse, переменная YourName заполнится символами J, e, s, s, e и \0. Последним будет концевой нулевой символ, так как cin автоматически вставляет его. Поэтому при определении размера буфера нужно позаботиться о том, чтобы он был достаточно большим и мог вместить все символы строки, включая концевой нулевой символ. Более подробно о поддержке концевого нулевого символа стандартными библиотечными строковыми функциями речь пойдет на занятии 21.

<p>Проблемы, возникающие при вводе строк</p></span><span>

Успешно выполнив все описанные ранее операции с объектом cin, вы будете неприятно удивлены, если попытаетесь ввести в строке полное имя. Дело в том, что cin рассматривает пробел как заданный по умолчанию разделитель строк. После того как в строке обнаруживается пробел, ввод строки завершается добавлением концевого нулевого символа. Эта проблема показана в листинге 16.2.

Листинг 16.2. Попытка ввода бодев одного сша с помощьм cin  

1: //Листинг 16.2. Проблемы с вводом строки с помощью cin

2:

3: #include

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

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.

<p>Оператор >> возвращает ссылку на объект istream</p></span><span>

Оператор >> возвращает ссылку на объект 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, но речь об этом пойдет дальше.

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT