Главная страница
Навигация по странице:

  • В 1.6. Функции позиционирования файла

  • В 1.7. Функции обработки ошибок

  • В 2. Проверки класса символа

  • В 3. Функции, оперирующие со строками

  • В 4. Математические функции

  • В 5. Функции общего назначения

  • В 6. Диагностика

  • Язык программирования Си Брайан Керниган, Деннис Ритчи 3е издание Версия 1 Table of Contents


    Скачать 2.33 Mb.
    НазваниеЯзык программирования Си Брайан Керниган, Деннис Ритчи 3е издание Версия 1 Table of Contents
    Дата18.09.2022
    Размер2.33 Mb.
    Формат файлаpdf
    Имя файлаBrian_Kernighan_Dennis_Ritchie-The_C_Programming_Language-RU.pdf
    ТипДокументы
    #683263
    страница30 из 31
    1   ...   23   24   25   26   27   28   29   30   31
    В 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. Функции, оперирующие со строками: char *strcpy(s, ct) копирует строку ct в строку s
    , включая '\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
    , и >0, если cs>ct
    15
    char strncmp(cs, ct) сравнивает не более n
    символов cs и ct
    ; возвращает <0, если cs, 0, если cs==ct
    , и >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
    , если первый несовпавший элемент в 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 игнорируется.
    1   ...   23   24   25   26   27   28   29   30   31


    написать администратору сайта