Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
16.02.2016
Размер:
1.2 Mб
Скачать

Void newHandler()

{

cout « "\nHeдостаточно памяти!\n";

}

Int main()

{

int* ptr;

set_new_handler(newHandler);

ptr = new int[100];

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

*(ptr+i) = 100-i;

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

cout « *(ptr+i) « " ";

delete[] ptr;

long double* 1ptr;

if(Iptr = new long double[999999])

{

cout « "\nГотово!";

delete[] 1ptr;

} else

cout « "\nНеудача...";

return 0;

}

В начале представленной программы подключается уже знакомый заголовочный файл iostream.h для использования операций ввода/вывода, а также файл new.h для определения обработчика ошибок set_new_handler. Функция newHandler(). реализованная в начале программы, является собственно обработчиком ошибок выделения памяти. Она подключается в строке set_new_handler(newHandler);

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

"Недостаточно памяти!".

В главной функции программы следует объявление целочисленного указателя ptr, которому тут же оператором new присваивается адрес выделенного блока динамической памяти для 100 значений типа int. Далее область памяти заполняется в цикле числами от 100 до 1, а в следующем цикле осуществляется вывод ее содержимого, после чего выделенный блок динамической памяти освобождается (оператор delete []). Следующий шаг - попытка выделения памяти для большого массива типа long double. Если результат операции new[] нe нулевой, указателю 1ptr будет присвоено значение адреса зарезервированной памяти с выводом надписи " Готово!" и последующим высвобождением области. В случае неудачного выделения выводится сообщение " Неудача.. .".

Массивы символов в C++

В стандарт С++ включена поддержка нескольких наборов символов. Традиционный 8-битовый набор символов называется "узкими" символами. Кроме того, включена поддержка 16-битовых символов, которые называются "широкими". Для каждого из этих наборов символов в библиотеке имеется своя совокупность функций.

Как и в ANSI С, для представления символьных строк в С++ не существует специального строкового типа. Вместо этого строки в С++ представляются как массивы элементов типа char, заканчивающиеся терминатором строки - символом с нулевым значением ('\0'). Строки. заканчивающиеся нуль-терминатором, часто называют ASCIIZ-строками. Символьные строки состоят из набора символьных констант, заключенного в двойные кавычки:

"Это строка символов..."

В таблице 4.1 приведен набор констант, применяющихся в C++ в качестве символов.

Таблица 4.1. Классификация символов

прописная буква

от 'А' до 'Z',от 'А' до 'Я'

строчная буква

от 'а1 до 'z',от 'а' до 'я'

цифра

от ' 0' до ' 9 '

пустое место

горизонтальная табуляция ' \9 ' . перевод строки (код ASCII 1 0), вертикальная табу ляция (код ASCII 11), перевод формы код ASCII 12), возврат каретки

(код ASCII 13)

символы

пунктуации

!"#$%&' ()*+,-./:;<=>?@[\]^_{|}~

управляющий символ

все символы с колами от 0 до 1Fh включительно и символ с кодом 7Fh

пробел

символ пробела (код ASCII 32)

шестнадцатеричная цифра

от '0' до '9', от 'А' до 'F', от 'а' до 'f '

При объявлении строкового массива необходимо принимать во внимание наличие терминатора в конце строки, отводя тем самым под строку на один байт больше:

// Объявление строки размером 10 символов,

// включая терминатор. Реальный размер

// строки: 9 символов + 1 терминатор

char buffer[10];

Строковый массив может при объявлении инициализироваться начальным значением. При этом компилятор автоматически вычисляет размер будущей строки в добавляет в конец нуль-терминатор:

// Объявление и инициализация строки:

char Wednesday[] = "Среда";

// что равносильно:

char Wednesday[]=

{'С','р','е','д','а','\0'};

В качестве оператора ввода при работе со строками вместо оператора записи в поток » лучше использовать функцию getline (), так как потоковый оператор ввода игнорирует вводимые пробелы, а кроме того, может продолжить ввод элементов за пределами массива, если под строку отводится меньше места, чем вводится символов. Функция getline() принимает два параметра: первый аргумент указывает на строку, в которую осуществляется ввод, а второй - число символов, подлежащих вводу.

Рассмотрим пример объявления символьных строк и использования функции ввода getline ().

#include <iostream.h>

Соседние файлы в папке ЛекцииКарасева