Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Шрифт:
Интервал:
Закладка:
Б.10.3. Строки в стиле языка С
Строки в стиле языка C представляют собой массивы элементов типа char, завершающиеся нулем. Эти строки обрабатываются функциями, описанными в заголовках <cstring> (или <string.h>; примечание: но не <string>) и <cstdlib>.
Эти функции оперируют строками в стиле языка С с помощью указателей char* (указатели const char* ссылаются на ячейки памяти, предназначенные исключительно для чтения).
Обратите внимание на то, что в языке C++ функции strchr() и strstr() дублируются, чтобы обеспечить безопасность типов (они не могут преобразовать тип const char* в тип char*, как их аналоги в языке C); см. также раздел 27.5.
Функции извлечения символов просматривают строку в стиле языка С в поисках соответственно форматированного представления числа, например "124" и "1.4". Если такое представление не найдено, функция извлечения возвращает 0. Рассмотрим пример.
int x = atoi("fortytwo"); /* x становится равным 0 */
Б.10.4. Память
Функции управления памятью действуют в “голой памяти” (без известного типа) с помощью указателей типа void* (указатели const void* ссылаются на ячейки памяти, предназначенные только для чтения).
Функции malloc() и ей подобные не вызывают конструкторы, а функция free() не вызывает деструкторы. Не применяйте эти функции к типам, имеющим конструкторы или деструкторы. Кроме того, функция memset() также никогда не должна применяться к типам, имеющим конструктор.
Функции, начинающиеся с приставки mem, описаны в заголовке <cstring>, а функции выделения памяти — в заголовке <cstdlib>.
См. также раздел 27.5.2.
Б.10.5. Дата и время
В заголовке <ctime> можно найти несколько типов и функций, связанных с датами и временем.
Структура tm определяется примерно так:
struct tm {
int tm_sec; // секунда минуты [0:61]; 60 и 61
//"високосные" секунды
int tm_min; // минута часа [0,59]
int tm_hour; // час дня [0,23]
int tm_mday; // день месяца [1,31]
int tm_mon; // месяц года [0,11]; 0 — январь (примечание: не [1:12])
int tm_year; // год с 1900- го года ; 0 — 1900-й год,
// 102 — 2002-й год
int tm_wday; // дни, начиная с воскресенья [0,6]; 0 — воскресенье
int tm_yday; // дней после 1 января [0,365]; 0 — 1 января
int tm_isdst; // часы летнего времени
};
Функции для работы с датами и временем
clock_t clock(); // количество тактов таймера после старта программы
time_t time(time_t* pt); // текущее календарное
// время
double difftime(time_t t2, time_t t1); // t2–t1 в секундах
tm* localtime(const time_t* pt); // локальное время для *pt
tm* gmtime(const time_t* pt); // время по Гринвичу (GMT) tm для
// *pt или 0
time_t mktime(tm* ptm); // time_t для *ptm или time_t(–1)
char* asctime(const tm* ptm); // представление *ptm в виде
// C-строки
char* ctime(const time_t* t) { return asctime(localtime(t)); }
Пример результата вызова функции asctime(): "Sun Sep 16 01:03:52 1973n".
Рассмотрим пример использования функции clock для измерения времени работы функции (do_something()).
int main(int argc, char* argv[])
{
int n = atoi(argv[1]);
clock_t t1 = clock(); // начало отсчета
if (t1 == clock_t(–1)) { // clock_t(–1) означает "clock()
// не работает "
cerr << "Извините, таймер не работает n";
exit(1);
}
for (int i = 0; i<n; i++) do_something(); // временной цикл
clock_t t2 = clock(); // конец отсчета
if (t2 == clock_t(–1)) {
cerr << "Извините, таймер переполнен n";
exit(2);
}
cout << "do_something() " << n << " работала "
<< double(t2–t1)/CLOCKS_PER_SEC << " секунд "
<< " (точность измерения: " << CLOCKS_PER_SEC
<< " секунд )n";
}
Явное преобразование double(t2–t1) перед делением является необходимым, потому что число clock_t может быть целым. Для значений t1 и t2, возвращаемых функцией clock(), величина double(t2–t1)/CLOCKS_PER_SEC является наилучшим системным приближением времени в секундах, прошедшего между двумя вызовами.
Если функция clock() не поддерживается процессором или временной интервал слишком длинный, то функция clock() возвращает значение clock_t(–1).
Б.10.6. Другие функции
В заголовке <cstdlib> определены следующие функции.
Функция для сравнения (cmp), используемая функциями qsort() и bsearch(), должна иметь следующий тип:
int (*cmp)(const void* p,const void* q);
Иначе говоря, функции сортировки не известен тип упорядочиваемых элементов: она просто интерпретирует массив как последовательность байтов и возвращает целое число, удовлетворяющее следующим условиям:
• оно является отрицательным, если *p меньше, чем *q;
• оно равно нулю, если *p равно *q;
• оно больше нуля, если *p больше, чем *q.
Подчеркнем, что функции exit() и abort() не вызывают деструкторы. Если хотите вызывать деструкторы для статических объектов и объектов, созданных автоматически (см. раздел A.4.2), генерируйте исключение.
Более полную информацию о функциях из стандартной библиотеки можно найти в книге K&R или другом авторитетном справочнике по языку С++.
Б.11. Другие библиотеки
Исследуя возможности стандартной библиотеки, вы, конечно, не найдете чего-то, что могло бы быть полезным для вас. По сравнению с задачами, стоящими перед программистами, и огромным количеством доступных библиотек, стандартная библиотека языка C++ является довольно скромной. Существует много библиотек, предназначенных для решения следующих задач.
• Графические пользовательские интерфейсы.
• Сложные математические вычисления.
• Доступ к базам данных.
• Работа в сети.
• XML.
• Дата и время.
• Система манипуляции файлами.
• Трехмерная графика.
•