Программирование >>  Структурное программирование 

1 ... 91 92 93 [ 94 ] 95 96 97 ... 342


Типичная ошибка программирования 4.7

Недостаточный размер массива, в который с помощью cin вводится символьная строка с клавиатуры, может привести к потере данных в программе и к другим ошибкам выполнения.

Символьный массив, представляющий строку, может быть выведен с помощью cout и . Массив string2 печатается оператором

cout << string2 << endl;

Заметим, что cout, подобно cin, не заботиться о размерах символьного массива. Символы строки печатаются до тех пор, пока не встретится завершающий нулевой символ.

Рисунок 4.12 демонстрирует присваивание начальных условий символьному массиву с помощью литеральной константы, чтение строки в символьный массив, печать символьного массива как строки и доступ к отдельным символам строки.

В программе рис. 4.12 использована структура for для циклической обработки массива stringl и печати отдельных символов, разделенных пробелами. Условие stringl[ i ] I=\0 в цикле for выполняется до тех пор, пока в строке не встретится завершающий нулевой символ.

В главе 3 обсуждалась спецификация класса памяти static. Локальная переменная класса static в описании функции существует в течение всего времени выполнения программы, но она видима только в теле функции. Мы можем применить static при объявлении локального массива, чтобы не создавать его и не задавать ему начальных условий при каждом вызове функции и не уничтожать его при каждом выходе из функции.

Массивы, объявленные как static, получают начальные значения при загрузке программы. Если массив static не получает начальные значения явно, от программиста, то компилятор присваивает ему нулевые начальные значения.

Мы также можем ввести строку непосредственно в символьный массив с клавиатуры, используя cin и . Например, объявление

char string2[20];

создает символьный массив, способный хранить строку из 19 символов и завершаюп1;ий нулевой символ. Оператор

cin >> string2;

считывает строку с клавиатуры в string2. Обратите внимание, что в предыдущем операторе в cin использовано только имя массива и нет никакой информации о его размере. В обязанности программиста входит убедиться в том, что массив, в который записывается строка, способен вместить любую строку, которую пользователь напечатает на клавиатуре, cin читает символы с клавиатуры до тех пор, пока не встретится первый разделитель в тексте, и при этом не заботится о размерах массива. Таким образом cin может вставлять данные и после конца массива (смотри раздел 5.12, где обсуждается вопрос о предотвращении вставки после конца символьного массива).



Введите строку: Привет строка! равна: Привет строка2 равна: литеральная константа строка! с пробелами между символёши равна: Ei.ftt, Привет

Рис. 4.12. Представление символьного массива как строки

Рис. 4.13 демонстрирует функцию staticArraylnit с локальным массивом, объявленным как static, и функцию automaticArraylnit с автоматическим локальным массивом. Функция staticArraylnit вызывается дважды. Локальный массив класса static получает начальные условия, равные нулю, от компилятора. Функция печатает массив, добавляет 5 к каждому элементу и печатает массив снова. При повторном вызове функции массив класса static содержит значения, запомненные при первом вызове функции. Функция automaticArraylnit также вызывается дважды. Элементы автоматического локального массива получают начальные значения 1, 2 и 3. Функция печатает массив, добавляет 5 к каждому элементу и печатает массив снова. При повторном вызове функции элементы массива снова получают начальные значения 1, 2 и 3, потому что массив имеет автоматический класс памяти.

Типичная ошибка программирования 4.8

Предположение, что элементы локального массива класса static в функции получают нулевые начальные значения при каждом вызове функции.

Представление символьного массива как строки iclude <iostream.h>

main () {

char stringl[20], string2[ ] = литеральная константа ;

cout Введите строку: ; cin >> stringl;

cout << cTpoKal равна: << stringl << endl строка2 равна: string2 endl << cTpoKal с пробелами между символами равна: endl;

for (int 1=0; stringl[i] != \0; i++) cout stringl[i] ;

cout << endl; return 0;

mm }



функция, демонстрирующая статический локальный массив

void StaticArraylnit(void)

Static int arrayl[3];

cout << endl Значения при входе в staticArraylnit: endl;

for (int i = 0; i < 3; i++)

cout массиБ1[ i << ] = arrayl[i] ;

cout << endl << Значения при выходе из staticArraylnit: endl;

for (i = 0; i < 3; i++)

cout << массив! [ << i ] = (arrayl[i] += 5) ;

функция для демонстрации автоматического локального массива

void automaticArraylnit(void)

int аггау2[3] = {1, 2, 3};

cout << endl endl

<< Значения при входе в automaticArraylnit: endl;

for (int i = 0; i < 3; i++)

cout массив2[ << i ] = array2[i] << ;

cout << endl << Значения при выходе из automaticArraylnit: endl;

for (i = 0; i < 3; i++)

cout массив2[ i ] = (array2[i] += 5) ;

Рис. 4.13. Сравнение присваивания начальных значений массиву типа static и автоматическому массиву (часть 1 из 2)

Массивы типа static получают нулевые начальные условия include <iostream.h>

Id staticArraylnit(void); lid automaticArraylnit(void);

main() {

cout << Первый вызов каждой функции: << endl; staticArraylnit(); automaticArraylnit();

cout endl << endl << Второй вызов каждой функции: << endl; StaticArraylnit(); automaticArraylnit ();

return 0;



1 ... 91 92 93 [ 94 ] 95 96 97 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика