Язык программирования Си Брайан Керниган, Деннис Ритчи 3е издание Версия 1 Table of Contents
Скачать 2.33 Mb.
|
В 1.5. Функции прямого ввода-вывода size_t fread(void *ptr, size_t size, size_t nobj, FILE *strem) fread читает из потока stream в массив ptr не более nobj объектов размера size . Она возвращает количество прочитанных объектов, которое может быть меньше заявленного. Для индикации состояния после чтения следует использовать feof и ferror size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE «stream) fwrite пишет из массива ptr в stream nobj объектов размера size ; возвращает число записанных объектов, которое в случае ошибки меньше nobj В 1.6. Функции позиционирования файла int fseek(FILE *stream, long offset, int origin) fseek устанавливает позицию для stream ; последующее чтение или запись будет производиться с этой позиции. В случае бинарного файла позиция устанавливается со смещением offset — относительно начала, если origin равен SEEK_SET ; относительно текущей позиции, если origin равен SEEK_CUR ; и относительно конца файла, если origin равен SEEK_END . Для текстового файла offset должен быть нулем или значением, полученным с помощью вызова функции ftell . При работе с текстовым файлом origin всегда должен быть равен SEEK_SET long ftell(FILE *stream) ftell возвращает текущую позицию потока stream или -1L , в случае ошибки. void rewind(FILE *stream) rewind (fp) делает то же, что и fseek(fp, 0L, SEEK_SET); clearerr(fp) int fgetpos(FILE *stream, fpos_t *ptr) fgetpos записывает текущую позицию потока stream в *ptr для последующего использования ее в fsetpos . Тип fpos_t позволяет хранить такого рода значения. В случае ошибки fgetpos возвращает ненулевое значение. int fsetpos(FILE *stream, const fpos_t *ptr) fsetpos устанавливает позицию в stream , читая ее из *ptr , куда она была записана ранее с помощью fgetpos . В случае ошибки fsetpos возвращает ненулевое значение. В 1.7. Функции обработки ошибок Многие функции библиотеки в случае ошибки или конца файла устанавливают индикаторы состояния. Эти индикаторы можно проверять и изменять. Кроме того, целое выражение errno (объявленное в ) может содержать номер ошибки, который дает дополнительную информацию о последней из обнаруженных ошибок. void clearerr(FILE *stream) clearerr очищает индикаторы конца файла и ошибки потока stream int feof(FILE *stream) feof возвращает ненулевое значение, если для потока stream установлен индикатор конца файла. int ferror(FILE *stream) ferror возвращает ненулевое значение, если для потока stream установлен индикатор ошибки. void perror(const char *s) perror(s) печатает s и зависимое от реализации сообщение об ошибке, соответствующее целому значению в errno , т. е. делает то же, что и обращение к функции fprintf вида fprintf(stderr, "%s: %s\n", s, " сообщение обошибке") См. strerror в параграфе ВЗ. В 2. Проверки класса символа: Заголовочный файл объявляет функции, предназначенные для проверок символов. Аргумент каждой из них имеет тип int и должен либо представлять собой EOF , либо быть значением unsigned char , приведенным к int ; возвращаемое значение тоже имеет тип int . Функции возвращают ненулевое значение ("истина"), когда аргумент с удовлетворяет описанному условию или принадлежит указанному классу символов, и нуль в противном случае. isalnum(c) — isalpha(c) или isdigit (с) есть истина isalpha(c) — isupper(c) или islower(c) есть истина iscntrl(c) — управляющий символ isdigit(c) — десятичная цифра isgraph(c) — печатаемый символ кроме пробела islower(c) — буква нижнего регистра isprint(c) — печатаемый символ, включая пробел ispunct(c) — печатаемый символ кроме пробела, буквы или цифры isspace(c) — пробел, смена страницы, новая строка, возврат каретки, табуляция, вертикальная табуляция isupper(c) — буква верхнего регистра isxdigit(c) — шестнадцатеричная цифра В наборе семибитовых ASCII-символов печатаемые символы находятся в диапазоне от 0x20 ( ' ' ) до Ох7Е ( '— ' ); управляющие символы — от 0 (NUL) до 0x1F (US) и Ox7F (DEL). Помимо перечисленных есть две функции, приводящие буквы к одному из регистров: int tolower(int с) — переводит с на нижний регистр; int toupper(int с) — переводит с на верхний регистр. Если с — буква на верхнем регистре, то tolower(с) выдаст эту букву на нижнем регистре; в противном случае она вернет с . Если с — буква на нижнем регистре, то toupper(с) выдаст эту букву на верхнем регистре; в противном случае она вернет с В 3. Функции, оперирующие со строками: Имеются две группы функций, оперирующих со строками. Они определены в заголовочном файле . Имена функций первой группы начинаются с букв str , второй — с mem . Если копирование имеет дело с объектами, перекрывающимися по памяти, то, за исключением memmove , поведение функций не определено. Функции сравнения рассматривают аргументы как массивы элементов типа unsigned char В таблице B 3 переменные s и t принадлежат типу char * , cs и ct — типу const char * , n — типу size_t , а с — значение типа int , приведенное к типу char В 3. Функции, оперирующие со строками: , включая '\0' ; возвращает s char *strncpy(s, ct, n) копирует не более n символов строки ct в s ; возвращает s . Дополняет результат символами '\0' , если символов в ct меньше n char *strcat(s, ct) приписывает ct к s ; возвращает s char *strncat(s, ct, n) приписывает не более n символов ct к s , завершая s символом '\0' ; возвращает s char strcmp(cs, st) сравнивает cs и ct ; возвращает <0, если cs , и >0, если cs>ct 15 char strncmp(cs, ct) сравнивает не более n символов cs и ct ; возвращает <0, если cs , и >0, если cs>ct char *strchr(cs, c) возвращает указатель на первое вхождение с в cs или, если такового не оказалось, NULL char *strrchr(cs, c) возвращает указатель на последнее вхождение с в cs или, если такового не оказалось, NULL size_t strspn(cs, ct) возвращает длину начального сегмента cs , состоящего из символов, входящих в строку ct size_t strcspn(cs, ct) возвращает длину начального сегмента cs , состоящего из символов, не 15 Здесь и ниже под такими выражениями как cs , если первый несовпавший элемент в cs арифметически меньше (больше) соответствующего элемента из ct . — Примеч. ред. входящих в строку ct char *strpbrk(cs, ct) возвращает указатель в cs на первый символ, который совпал с одним из символов, входящих в ct , или, если такового не оказалось, NULL char *strstr(cs, ct) возвращает указатель на первое вхождение ct в cs или, если такового не оказалось, NULL size_t strlen(cs) возвращает длину cs char * strerror(n) возвращает указатель на зависящую от реализации строку, соответствующую номеру ошибки n char * strtok(s, ct) ищет в s лексему, ограниченную символами из ct ; более подробное описание этой функции см. ниже Последовательные вызовы strtok разбивают строку s на лексемы. Ограничителем лексемы служит любой символ из строки ct . В первом вызове указатель s не равен NULL . Функция находит в строке s первую лексему, состоящую из символов, не входящих в ct ; ее работа заканчивается тем, что поверх следующего символа пишется '\0' и возвращается указатель на лексему. Каждый последующий вызов, в котором указатель s равен NULL , возвращает указатель на следующую лексему, которую функция будет искать сразу за концом предыдущей. Функция strtok возвращает NULL , если далее никакой лексемы не обнаружено. Параметр ct от вызова к вызову может варьироваться. Функции mem... предназначены для манипулирования с объектами как с массивами символов; их назначение — получить интерфейсы к эффективным программам. В приведенной ниже таблице s и t принадлежат типу void * ; cs и ct — типу const void * ; n — типу size_t ; а с имеет значение типа int , приведенное к типу char void *memcpy(s, ct, n) копирует n символов из ct в s и возвращает s void *memmove(s, ct, n) делает то же самое, что и memcpy , но работает и в случае "перекрывающихся" объектов. int memcmp(cs, ct, n) сравнивает первые n символов cs и ct ; выдает тот же результат, что и функция strcmp void *memchr(cs, c, n) возвращает указатель на первое вхождение символа с в cs или, если среди первых n символов с не встретилось, NULL void *memset(s, с, n) размещает символ с в первых n позициях строки s и возвращает s В 4. Математические функции: В заголовочном файле описываются математические функции и определяются макросы. Макросы EDOM и ERANGE (находящиеся в ) задают отличные от нуля целочисленные константы, используемые для фиксации ошибки области и ошибки диапазона; HUGE_VAL определена как положительное значение типа double . Ошибка области возникает, если аргумент выходит за область значений, для которой определена функция. Фиксация ошибки области осуществляется присвоением errno значения EDOM ; возвращаемое значение зависит от реализации. Ошибка диапазона возникает тогда, когда результат функции не может быть представлен в виде double . В случае переполнения функция возвращает HUGE_VAL с правильным знаком и в errno устанавливается значение ERANGE . Если результат оказывается меньше, чем возможно представить данным типом, функция возвращает нуль, а устанавливается ли в этом случае в errno ERANGE , зависит от реализации. Далее x и y имеют тип double , n — тип int , и все функции возвращают значения типа double . Углы в тригонометрических функциях задаются в радианах. sin(x) синус x cos(x) косинус x tan(x) тангенс x asin(x) арксинус х в диапазоне *-/2, /2], х [-1, 1] acos(x) арккосинус x диапазоне *0, ], х [-1, 1] atan(x) арктангенс х в диапазоне *-/2, /2] atan2(y, x) арктангенс y / х в диапазоне *-, ] sinh(x) гиперболический синус х cosh(x) гиперболический косинус х tanh(x) гиперболический тангенс х exp(x) экспоненциальная функция е x log(x) натуральный логарифм ln( x ), х > 0 log10(x) десятичный логарифм log 10 ( x ), х > 0 pow(x, y) x y . Ошибка области, если х = 0 и y < 0 или x < 0 и y — не целое sqrt(x) корень квадратный из x , х > 0 ceil(x) наименьшее целое в виде double , которое не меньше x floor(x) наибольшее целое в виде double , которое не больше х fabs(x) абсолютное значение | x | ldexp(x, n) x * 2 n frexp(x, int *exp) разбивает х на два сомножителя, первый из которых — нормализованная дробь в интервале *1/2, 1), которая возвращается, а второй — степень двойки, эта степень запоминается в *ехр . Если х — нуль, то обе части результата равны нулю modf(x, double *ip) разбивается на целую и дробную части, обе имеют тот же знак, что и х . Целая часть запоминается в *ip , дробная часть выдается как результат fmod(x, y) остаток от деления х на y в виде числа с плавающей точкой. Знак результата совпадает со знаком х . Если y равен нулю, результат зависит от реализации В 5. Функции общего назначения: Заголовочный файл объявляет функции, предназначенные для преобразования чисел, запроса памяти и других задач. double atof(const char *s) atof переводит s в double ; эквивалентна strtod(s, (char**) NULL) int atoi(const char *s) переводит s в int ; эквивалентна (int) strtol (s, (char**)NULL, 10) int atol(const char *s) переводит s в long; эквивалентна strtol(s, (char**) NULL, 10). double strtod(const char *s, char **endp) strtod преобразует первые символы строки s в double , игнорируя начальные символы- разделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL ), при переполнении она выдает HUGE_VAL с соответствующим знаком, в случае, если результат оказывается меньше, чем возможно представить данным типом, возвращается 0; в обоих случаях в errno устанавливается ERANGE long strtol(const char *s, char **endp, int base) strtol преобразует первые символы строки s в long , игнорируя начальные символы-разделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL ). Если base находится в диапазоне от 2 до 36, то преобразование делается в предположении, что на входе — запись числа по основанию base . Если base равно нулю, то основанием числа считается 8, 10 или 16; число, начинающееся с цифры 0, считается восьмеричным, а с 0х или 0Х — шестнадцатеричным. Цифры от 10 до base -1 записываются начальными буквами латинского алфавита в любом регистре. При основании, равном 16, в начале числа разрешается помещать 0х или 0Х. В случае переполнения функция возвращает LONG_MAX или LONG_MIN (в зависимости от знака), а в errno устанавливается ERANGE unsigned long strtoul(const char *s, char **endp, int base) strtoul работает так же, как и strtol , с той лишь разницей, что возвращает результат типа unsigned long , а в случае переполнения — ULONG_MAX int rand(void) rand выдает псевдослучайное число в диапазоне от 0 до RAND_MAX ; RAND_MAX не меньше 32767. void srand(unsigned int seed) srand использует seed в качестве семени для новой последовательности псевдослучайных чисел. Изначально параметр seed равен 1. void *calloc(size_t nobj, size_t size) calloc возвращает указатель на место в памяти, отведенное для массива nobj объектов, каждый из которых размера size , или, если памяти запрашиваемого объема нет, NULL . Выделенная область памяти обнуляется. void *malloc(size_t size) malloc возвращает указатель на место в памяти для объекта размера size или, если памяти запрашиваемого объема нет, NULL . Выделенная область памяти не инициализируется. void *realloc(void *p, size_t size) realloc заменяет на size размер объекта, на который указывает р . Для части, размер которой равен наименьшему из старого и нового размеров, содержимое не изменяется. Если новый размер больше старого, дополнительное пространство не инициализируется, realloc возвращает указатель на новое место памяти или, если требования не могут быть удовлетворены, NULL ( *p при этом не изменяется). void free(void *p) free освобождает область памяти, на которую указывает р ; эта функция ничего не делает, если р равно NULL . В р должен стоять указатель на область памяти, ранее выделенную одной из функций: calloc , malloc или realloc void abort(void *p) abort вызывает аварийное завершение программы, ее действия эквивалентны вызову raise(SIGABRT) void exit(int status) exit вызывает нормальное завершение программы. Функции, зарегистрированные с помощью atexit , выполняются в порядке, обратном их регистрации. Производится опорожнение буферов открытых файлов, открытые потоки закрываются, и управление возвращается в среду, из которой был произведен запуск программы. Значение status , передаваемое в среду, зависит от реализации, однако при успешном завершении программы принято передавать нуль. Можно также использовать значения EXIT_SUCCESS (в случае успешного завершения) и EXIT_FAILURE (в случае ошибки). int atexit(void (*fcn)(void)) atexit регистрирует fcn в качестве функции, которая будет вызываться при нормальном завершении программы; возвращает ненулевое значение, если регистрация не может быть выполнена. int system(const char *s) system передает строку s операционной среде для выполнения. Если s есть NULL и существует командный процессор, то system возвращает ненулевое значение. Если s не NULL , то возвращаемое значение зависит от реализации. char *getenv(const char *name) getenv возвращает строку среды, связанную с name , или, если никакой строки не существует, NULL Детали зависят от реализации. void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum)) bsearch ищет среди base[0] base[n-1] элемент с подходящим ключом *key . Функция cmp должна сравнивать первый аргумент (ключ поиска) со своим вторым аргументом (значением ключа в таблице) и в зависимости от результата сравнения выдавать отрицательное число, нуль или положительное значение. Элементы массива base должны быть упорядочены в возрастающем порядке, bsearch возвращает указатель на элемент с подходящим ключом или, если такого не оказалось, NULL void qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *)) qsort сортирует массив base[0] base[n-1] объектов размера size в возрастающем порядке. Функция сравнения cmp — такая же, как и в bsearch int abs(int n) abs возвращает абсолютное значение аргумента типа int long labs(long n) labs возвращает абсолютное значение аргумента типа long div_t div(int num, int denom) div вычисляет частное и остаток от деления num на denom . Результаты типа int запоминаются в элементах quot и rem структуры div_t ldiv_t ldiv(long num, long denom) ldiv вычисляет частное и остаток от деления num на denom . Результаты типа long запоминаются в элементах quot и rem структуры ldiv_t В 6. Диагностика: Макрос assert используется для включения в программу диагностических сообщений. void assert (int выражение) Если выражение имеет значение нуль, то assert (выражение) напечатает в stderr сообщение следующего вида: Assertion failed: выражение, file имя-файла, line nnn после чего будет вызвана функция abort , которая завершит вычисления. Имя исходного файла и номер строки будут взяты из макросов __FILE__ и __LINE__ Если в момент включения файла было определено имя NDEBUG , то макрос assert игнорируется. |