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

  • 314 Приложение В. Стандартная библиотека Таблица Преобразования

  • Преобразования Символ Данные на вводе; тип аргумента

  • 318 Приложение В. Стандартная библиотека

  • В 2. Проверки класса символа: 319В Функции обработки ошибок

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

  • 320 Приложение В. Стандартная библиотека

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

  • Б. Керриган, Д. Ритчи Язык программирования C. Б. Керниган, Д. зык программирования и . Издание 3е, исправленное Перевод с английского под редакцией Вс. С. Штаркмана СанктПетербург 2003


    Скачать 31.48 Mb.
    НазваниеБ. Керниган, Д. зык программирования и . Издание 3е, исправленное Перевод с английского под редакцией Вс. С. Штаркмана СанктПетербург 2003
    АнкорБ. Керриган, Д. Ритчи Язык программирования C.pdf
    Дата06.04.2017
    Размер31.48 Mb.
    Формат файлаpdf
    Имя файлаБ. Керриган, Д. Ритчи Язык программирования C.pdf
    ТипКнига
    #4546
    страница25 из 28
    1   ...   20   21   22   23   24   25   26   27   28
    312
    В. Стандартная библиотека
    запоминает строку в s и возвращает ее в качестве значения функ- ции; длина s должна быть не менее
    При каждом вызове гене- рируется новое имя; при этом гарантируется не более различных имен за один сеанс работы программы. Заметим, что tmpnam создает имя, а не файл.
    setvbuf(FILE
    char *buf, int mode, size_t size)
    управляет буферизацией потока; к ней следует обращаться прежде,
    чем будет выполняться чтение, запись или какая-либо другая mode со значением вызывает полную буферизацию, с _IOLBF - "построчную"
    буферизацию текстового файла, a mode со значением _IONBF отменяет всякую буферизацию. Если параметр buf не есть NULL, то его значение - указатель на бу- фер, в противном случае под буфер будет запрашиваться память. Параметр size задает размер буфера. Функция setvbuf в случае ошибки выдает ненуле- вое значение.
    void char *buf)
    Если buf есть NULL, то для потока stream буферизация выключается. В против- ном случае вызов setbuf приведет к тем же действиям, что и вызов (void)
    setvbuf (stream, b u f ,
    BUFSIZ).
    В
    Форматный вывод
    Функции осуществляют вывод информации по формату.
    int fprintf(FILE
    const char f p r i n t f преобразует и пишет вывод в поток stream под управлением f o r m a t .
    Возвращаемое значение - число записанных символов или, в случае ошибки,
    отрицательное значение.
    Форматная строка содержит два вида объектов: обычные символы, ко- пируемые в выводной поток, и спецификации преобразования, которые вызывают преобразование и печать остальных аргументов в том поряд- ке, как они перечислены. Каждая спецификация преобразования начи- нается с % и заканчивается символом-спецификатором преобразования.
    Между % и символом-спецификатором в порядке, в котором они здесь пе- речислены, могут быть расположены следующие элементы информации:
    • Флаги (в любом порядке), модифицирующие спецификацию:
    - указывает на то, что преобразованный аргумент должен быть прижат к левому краю поля;
    + - предписывает печатать число всегда со знаком;
    пробел - если первый символ - не знак, то числу должен предшествовать пробел;
    О - указывает, что числа должны дополняться слева нулями до всей ширины поля;
    - указывает из форм вывода:
    о первой циф- рой должен быть 0; для х или X ненулевому результату долж- ны предшествовать Ох или ОХ; для е, Е, f, g и G вывод должен

    В
    Ввод-вывод:
    313
    обязательно содержать десятичную точку; для g и 6 заверша- ющие нули не отбрасываются.
    • Число, специфицирующее минимальную ширину поля. Преобразованный аргумент будет напечатан в поле, размер которого не меньше указанной ши- рины, а если потребуется, в поле большего размера. Если число символов преобразованного аргумента меньше ширины то поле будет дополне- но слева (или справа, если число прижимается к левому краю). Обычно поле дополняется пробелами (или нулями, если присутствует флаг дополнения нулями).
    • Точка, отделяющая указатель ширины поля от указателя точности.
    • Число, задающее точность, которое специфицирует максимальное количе- ство символов, печатаемых из строки, или количество цифр после десятич- ной точки в преобразованиях е, Е или или количество значащих цифр для g или G-преобразования, или минимальное количество цифр при печати целого (до необходимой ширины поля число дополняется слева нулями).
    • Модификаторы h, 1 (буква ell) или указывает на то, что соответству- ющий аргумент должен печататься как short или unsigned short; "1" со- общает, что аргумент имеет тип long или unsigned long;
    информирует,
    что аргумент принадлежит типу long double.
    Ширина, или точность, или обе эти характеристики могут быть специфи- цированы с помощью в этом случае необходимое число "извлекается"
    из следующего который должен иметь тип
    (в случае двух звездочек используются два аргумента).
    Символы-спецификаторы и разъяснение их смысла приведены в таб- лице
    Если за % нет правильного символа-спецификатора, результат не определен.
    int printf(const char полностью эквивалентна int
    *s, const char
    ...)
    s p r i n t f действует так же, как и p r i n t f , только вывод осуществляет в строку s,
    завершая ее символом '
    Строка s должна быть достаточно большой, чтобы вмещать результат вывода. Возвращает количество записанных символов,
    в число которых символ '
    не входит.
    int vprintf (const char arg)
    int vfprintf (FILE
    const char va_list arg)
    int vsprintf (char const char va_list arg)
    Функции и
    эквивалентны соответствующим функциям с той лишь разницей, что переменный список аргументов представ- лен параметром arg, инициализированным макросом и, возможно,
    вызовами va_arg (см. в В7 описание

    314 Приложение В. Стандартная библиотека
    Таблица
    Преобразования printf
    Символ Тип аргумента;
    вид печати
    i знаковая десятичная запись о int; беззнаковая восьмеричная запись (без 0 слева)
    х, X unsigned
    Ох или ОХ слева), в качестве цифр от 10 до 15 используются для х и A8CDEF для X
    int; беззнаковое десятичное целое с int; единичный символ после преобразования в unsigned s char *; символы строки печатаются, пока не встретится '
    или не исчерпается количество символов, указанное точ- ностью f double; десятичная запись вида где количество
    d специфицируется точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной точки
    Е
    запись вида где количество d специфицирует- ся точностью. По умолчанию точность равна 6; нулевая точность подавляет печать десятичной точки g, G double; используется %е и если порядок меньше -4 или больше или равен точности; в противном случае исполь- зуется
    Завершающие нули и точка в конце не печата- ются р void *; печатает в виде указателя (представление зависит от реализации)
    n int число символов, напечатанных к данному моменту дан- ным вызовом p r i n t f , записывается в аргумент. Никакие другие аргументы не преобразуются
    % никакие аргументы не преобразуются; печатается %
    В 1.3. Форматный ввод
    Функции scanf имеют дело с форматным преобразованием при вводе.
    int fscanf(FILE
    const char читает данные из потока st ream под управлением f о и
    ные величины присваивает по порядку аргументам, каждый из которых дол-
    жен быть указателем. Завершает работу, если исчерпался формат. Выдает EOF

    В
    Ввод-вывод:
    315
    по исчерпании файла или перед любым преобразованием, если возникла ошиб- ка; в остальных случаях функция возвращает количество преобразованных и введенных элементов.
    Форматная строка обычно содержит спецификации преобразования,
    которые используются для управления вводом. В форматную строку мо- гут входить:
    • пробелы и табуляции, которые игнорируются;
    • обычные символы (кроме которые ожидаются в потоке ввода среди сим- волов, отличных от символов-разделителей;
    • спецификации преобразования, состоящие из %; необязательного знака *,
    подавляющего присваивание; необязательного числа, специфицирующего максимальную ширину поля; необязательных h, 1 или L, указывающих раз- мер присваиваемого значения, и символа-спецификатора преобразования.
    Спецификация преобразования определяет преобразование следующе- го поля ввода. Обычно результат размещается в переменной, на которую указывает соответствующий аргумент. Однако если присваивание подав- ляется с помощью знака как, например, в то поле ввода просто про- пускается, и никакого присваивания не происходит. Поле ввода опреде- ляется как строка символов, отличных от символов-разделителей; при этом ввод строки прекращается при выполнении любого из двух усло- вий: если встретился символ-разделитель или если ширина поля (в слу- чае, когда она указана) исчерпана. Из этого следует, что при переходе к следующему полю может "перешагивать" через границы строк, по- скольку символ новой строки является символом-разделителем. (Под сим- волами-разделителями понимаются символы пробела, табуляции, новой строки, возврата каретки, вертикальной табуляции и смены страницы.)
    Символ-спецификатор указывает на способ интерпретации поля вво- да. Соответствующий аргумент должен быть указателем. Список допус- тимых символов-спецификаторов приводится в таблице В-2.
    Символам-спецификаторам d,
    о, и х может предшествовать h, если аргумент есть указатель на short (а не или 1 (буква ell), если аргу- мент есть указатель на long. Символам-спецификаторам е, f и g может предшествовать 1, если аргумент - указатель на double (а не или если аргумент - указатель на long double.
    int
    (const char
    (...) делает то же,
    и f s c a n f int sscanf (const char *s, const char
    . . . )
    sscanf делает то же, что и s c a n f (...), только ввод символов осуществляет из строки s. .. ,

    316 Приложение В. Стандартная библиотека
    Таблица В-2. Преобразования
    Символ Данные на вводе;
    тип аргумента
    d десятичное целое; int *
    i целое;
    *. Целое может быть восьмеричным (с нулем сле- ва) или
    (с Ох или ОХ слева)
    о восьмеричное целое (с нулем слева или без него); int *
    и беззнаковое десятичное целое; u n s i g n e d int *
    х целое (с Ох или ОХ слева или без них);
    int *
    с символы;
    *. Символы ввода размещаются в указанном массиве в количестве, заданном шириной поля; по умол- чанию это количество равно 1. Символ '
    не добавляет- ся. Символы-разделители здесь рассматриваются как обычные символы и поступают в аргумент. Чтобы про- честь следующий символ-разделитель, используйте %1s s строка символов, отличных от символов-разделителей (за- писывается без кавычек);
    указывающий на массив размера достаточного, чтобы вместить строку и добавля- емый к ней символ '
    е, g число с плавающей точкой;
    *. Формат ввода для состоит из необязательного знака, строки цифр, возмож- но с десятичной точкой, и необязательного порядка, со- стоящего из Е или е и возможно со знаком р значение указателя в виде, в котором f
    его на- печатает; void *
    п записывает в аргумент число символов, прочитанных к это- му моменту в этом вызове; int *. Никакого чтения ввода не происходит. Счетчик числа введенных элементов не увеличивается
    [...] выбирает из ввода самую длинную непустую строку, состоя- щую из символов, заданных в квадратных скобках; char *.
    В конец строки добавляется '
    Спецификатор вида включает ] в задаваемое множество символов выбирает из ввода самую длинную непустую строку, состо- ящую из символов, не входящих в заданное в скобках мно- жество. В конец добавляется
    Спецификатор вида
    ] включает ] в задаваемое множество символов
    % обычный символ %; присваивание не делается

    В 1. Ввод-вывод:
    317
    В
    Функции ввода-вывода символов
    int fgetc(FILE
    f getc возвращает следующий символ из потока st ream в виде unsigned char (пе- реведенную в int) или если исчерпан файл или обнаружена ошибка.
    char *fgets(char *s, int n, FILE
    f gets читает не более символов в массив s, прекращая чтение, если встре- тился символ новой строки, который включается в массив; кроме того, запи- сывает в массив
    Функция fgets возвращает s или, если исчерпан файл или обнаружена ошибка, NULL.
    int с, FILE
    f пишет символ с (переведенный в unsigned char) в stream. Возвращает за- писанный символ или EOF в случае ошибки.
    int char *s, FILE
    f puts пишет строку s (которая может не иметь '
    в stream; возвращает нео- трицательное целое или EOF в случае ошибки.
    int getc(FILE
    getc делает то же, что и fgetc, но в отличие от последней, если она - макрос,
    может браться более одного раза.
    int getchar(void)
    делает то же, что char *gets(char *s)
    gets читает следующую строку ввода в массив s, заменяя символ новой строки на '
    Возвращает s или, если исчерпан файл или обнаружена ошибка, NULL.
    int с, FILE
    putc делает то же, что и f putc, но в отличие от последней, если putc - макрос,
    значение st ream может браться более одного раза.
    int putchar(int с)
    делает то же, что putc(c, stdout).
    int puts(const char *s)
    puts пишет строку s и символ новой строки в stdout. Возвращает EOF в случае ошибки, или неотрицательное значение, если запись прошла нормально.
    int ungetc(int с, FILE
    ungetc отправляет символ с (переведенный в unsigned char) обратно в stream;

    318 Приложение В. Стандартная библиотека
    при следующем чтении из st он будет получен снова. Для каждого потока вернуть можно не более одного символа. Нельзя возвращать EOF. В качестве результата выдает отправленный назад символ или, в случае ошибки,
    EOF.
    В
    Функции прямого ввода-вывода
    size_t
    *ptr, size_t size, size_t
    FILE
    f read читает из потока st ream в массив не более nobj объектов размера size.
    Она возвращает количество прочитанных объектов, которое может быть мень- ше заявленного. Для индикации состояния после чтения следует использовать feof и ferror.
    size_t fwrite(const void *ptr, size_t size, size_t n o b j , FILE
    write пишет из массива ptr в nobj объектов размера size; возвращает число записанных объектов, которое в случае ошибки меньше
    В
    Функции позиционирования файла
    int fseek(FILE
    long offset, int origin)
    устанавливает позицию для последующее чтение или запись бу- дет производиться с этой позиции. В случае бинарного файла позиция уста- навливается со смещением
    - относительно начала, если o r i g i n равен
    SEEK_SET; относительно текущей позиции, если o r i g i n равен и отно- сительно конца файла, если origin равен SEEK_END. Для текстового файла должен быть нулем или значением, полученным с помощью вызова функции
    При работе с текстовым файлом o r i g i n всегда должен быть равен
    SEEK_SET.
    long ftell(FILE
    ftell возвращает текущую позицию потока или в случае void rewind (fp) делает то же, что и fseek(fp, OL,
    clearerr(fp).
    int fgetpos(FILE
    fpos_t *ptr)
    f get pos записывает текущую позицию потока st ream в * pt для последующего использования ее в setpos. Тип позволяет хранить такого рода значе- ния. В случае ошибки f pos возвращает ненулевое значение.
    int fsetpos(FILE
    const fpos_t *ptr)
    pos устанавливает позицию в читая ее из куда она была запи- сана ранее с помощью fgetpos. В случае ошибки f setpos возвращает ненулевое значение.

    В 2. Проверки класса символа:
    319
    В
    Функции обработки ошибок
    Многие функции библиотеки в случае ошибки или конца файла уста- навливают индикаторы состояния. Эти индикаторы можно проверять и изменять.
    того, целое
    (объявленное в )
    может содержать номер ошибки, который дает дополнительную инфор- мацию о последней из обнаруженных ошибок.
    void очищает индикаторы конца файла и ошибки потока int feof(FILE
    возвращает ненулевое значение, если для потока st ream установлен ин- дикатор конца файла.
    int ferror(FILE
    возвращает ненулевое значение, если для потока stream установлен индикатор ошибки.
    void perror(const char *s)
    perror(s) печатает s и зависимое от реализации сообщение об ошибке, со- ответствующее целому значению в т. е. делает то же, что и обращение к функции f f вида s, сообщение
    См.
    в параграфе ВЗ.
    В 2. Проверки класса символа:
    Заголовочный файл объявляет функции, предназначенные для проверок символов. Аргумент каждой из них имеет тип int и должен либо представлять собой EOF, либо быть значением unsigned c h a r , приве- денным к int; возвращаемое значение тоже имеет тип int. Функции воз- вращают ненулевое значение ("истина"), когда аргумент с удовлетворяет описанному условию или принадлежит указанному классу символов,
    и нуль в противном случае.
    - isdiglt (с)
    истина isalpha(c) - islower(c) есть истина
    - управляющий символ isdigit(c) - десятичная цифра
    - печатаемый символ кроме пробела
    - буква нижнего регистра isprint(c) - печатаемый символ, включая пробел
    - печатаемый символ кроме пробела, буквы или цифры

    320 Приложение В. Стандартная библиотека
    isspace(c) - пробел, смена страницы, новая строка, возврат каретки, табуляция, вертикальная табуляция isupper(c) - буква верхнего регистра isxdigit(c) -
    В наборе семибитовых ASCII-символов печатаемые символы находятся в диапазоне от 0x20 (' ' ) до Ох7Е
    );
    символы - от О
    (NUL) до 0x1 F (US) и Ox7F (DEL).
    Помимо перечисленных есть две функции, приводящие буквы к одно- му из регистров:
    int tolower(int с) - переводит с на нижний регистр;
    int с) - переводит с на верхний регистр.
    Если с - буква на верхнем регистре, то выдаст эту букву на ниж- нем регистре; в противном случае она вернет с. Если с - буква на нижнем регистре, то toupper( с) выдаст эту букву на верхнем регистре; в против- ном случае она вернет с.
    В 3. Функции, оперирующие со строками:
    h>
    Имеются две группы функций, оперирующих со строками. Они опре- делены в заголовочном файле . Имена функций первой группы начинаются с букв второй - с mem. Если копирование имеет дело с объектами, перекрывающимися по памяти,
    за исключением поведение функций не определено. Функции сравнения рассматривают аргументы как массивы элементов типа unsigned
    В таблице на с.
    s и t типу c h a r
    - типу const char *, n - типу а с - значение типа int, приведенное типу char.
    Последовательные вызовы st rtok разбивают строку s на лексемы. Огра- ничителем лексемы служит любой символ из строки ct. В первом вызове указатель s не равен NULL. Функция находит в строке s первую лексему,
    состоящую из символов, не входящих в ct; ее работа заканчивается тем,
    что поверх следующего символа пишется '
    и возвращается указатель на лексему. Каждый последующий вызов, в котором указатель s равен
    NULL, возвращает указатель на следующую лексему, которую функция будет искать сразу за концом предыдущей. Функция возвращает
    NULL, если далее никакой лексемы не обнаружено. Параметр ct от вызова к вызову может варьироваться.
    Функции mem... предназначены для манипулирования с объектами с мас- сивами символов; их назначение - получить интерфейсы к эффективным

    В 3. Функции, оперирующие со строками:
    1   ...   20   21   22   23   24   25   26   27   28


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