Т.В. Руденко - Сборник задач и упражнений по языку Си (1114664), страница 13
Текст из файла (страница 13)
Возвращает EOF, если исчерпан файл или возникла ошибка; в остальных случаях - количество введенных и преобразованных значений.Строка формата обычно содержит спецификации преобразования, которыеиспользуются для управления вводом. Каждая спецификация преобразованияначинается символом % и заканчивается литерой-спецификатором преобразования. Между % и литерой-спецификатором могут быть расположены символыуправления вводом ( в том порядке, в каком они перечислены ниже):• символ *, который подавляет присваивание;• число, определяющее максимальную ширину поля ввода;• модификаторы h, l или L.
Литерам-спецификаторам d, i, o, u, x можетпредшествовать литера h, если соответствующий аргумент является указателемна short (а не на int), или литера l, если аргумент - указатель на long. Литерамспецификаторам e, f, g может предшествовать литера l, если аргумент - указатель на double (а не на float), или литера L, если аргумент - указатель на longdouble.60Кроме спецификаций преобразования, в строку-формат могут входитьпробелы и табуляции, которые игнорируются, а также обычные литеры(но не %), которые ожидаются в потоке ввода среди литер, отличных от пробельных.Под пробельными литерами понимаются литеры пробела, табуляции,новой-строки, возврата-каретки, вертикальной-табуляции и смены-страницы.Спецификация преобразования определяет способ интерпретации очередного поля ввода. Поле ввода определяется как строка непробельных литер;при этом ввод строки прекращается, если встретилась пробельная литера либоисчерпана ширина поля ввода.
Полученное значение присваивается переменной, на которую указывает соответствующий аргумент. Если присваивание подавляется при помощи *, то поле ввода пропускается, но никакого присваиванияне происходит.литеры-спецификаторы и их смысл при вводе----------------------------------------------------------------------------------------------------------литератип аргумента; вид печати----------------------------------------------------------------------------------------------------------dдесятичное целое; int *.iцелое; int *.
Целое может быть восьмеричным (с ведущим нулем)или шестнадцатиричным (с ведущими 0х или 0Х).овосьмеричное целое (с ведущим 0 или без него); int *.xшестнадцатиричное целое (с ведущими 0x или 0X или без них); int *.uбеззнаковое десятичное целое; unsigned int *.cлитеры; char *. Литеры ввода размещаются в указанном массиве вколичестве, заданном шириной поля; по умолчанию это значениеравно 1. Литера ‘\0’ не добавляется. Пробельные литеры здесь рассматриваются как обычные литеры и поступают в аргумент.
Чтобыпрочитать следующую непробельную литеру, используйте %1s.sстрока непробельных литер (записывается без кавычек); char*, указывающий на массив размера, достаточного, чтобы вместить строкуи добавляемую к ней литеру ‘\0’.e,f,gчисло с плавающей точкой; float *. Число содержит необязательныйзнак, непустую последовательность цифр ( возможно, с десятичнойточкой) и необязательную экспоненту, состоящую из E или e и целого (возможно, со знаком).pзначение указателя в виде, в котором его бы напечатала функцияprintf со спецификацией %p (представление зависит от реализации);void*.%обычная литера %; присваивание не происходит.int scanf ( const char* format,...)семантика функции полностью эквивалентна fscanf (stdin, const char*format,...).int sscanf (char *s, const char* format,...)61sscanf действует так же, как и scanf, только ввод литер осуществляет изстроки s.10.1.3.4Функции ввода-вывода литерint fgetc (FILE *stream)fgetc возвращает очередную литеру из потока stream в виде unsignedchar, переведенной в int, или EOF, если исчерпан файл или обнаруженаошибка.char *fgets (char *s, int n, FILE *stream)fgets читает не более n-1 литер в массив s, прекращая чтение, есливстретилась литера новая-строка, которая включается в массив; крометого, записывает в массив литеру ‘\0’.
Функция fgets возвращает s илиNULL, если исчерпан файл или обнаружена ошибка.int fputc ( int c, FILE * stream)fputc пишет литеру c, переведенную в unsigned char, в stream. Возвращает записанную литеру или EOF в случае ошибки.int fputs (const char *s, FILE * stream)fputs пишет строку s, которая может не иметь ‘\n’, в stream. Возвращаетнеотрицательное целое или EOF.int getc (FILE *stream)getc делает то же, что и fgetc, но в отличие от нее может быть макросом;в этом случае stream может быть вычислен более одного раза.int getchar (void)getchar() делает то же, что и getc(stdin).char *gets (char *s)gets читает следующую строку ввода в массив s, заменяя литеру новаястрока на ‘\0’.
Возвращает s или NULL, если исчерпан файл или обнаружена ошибка.int putc (int c, FILE *stream)putc делает то же, что и fputc, но в отличие от нее может быть макросом; в этом случае stream может быть вычислен более одного раза.int putchar (int c)putchar(c) делает то же, что и putc(c,stdout).int puts (const char *s)puts пишет строку s и литеру новая-строка в stdout.
В случае ошибкивозвращает EOF; если запись прошла нормально - неотрицательное значение.int ungetc (int c, FILE *stream)62ungetc отправляет литеру c (переведенную в unsigned char) обратно вstream; при следующем чтении из stream она будет получена снова. Длякаждого потока можно вернуть не более одной литеры. Нельзя возвращать EOF. В качестве результата ungetc выдает отправленную назад литеру или, в случае ошибки, EOF.10.1.3.5Функции позиционирования файлаint fseek (FILE *stream, long offset, int origin)fseek устанавливает позицию для stream; последующее чтение или запись будет производиться с этой позиции.
Новая текущая позиция устанавливается со смещением offset относительно положения, заданногозначением origin. Если origin равно 0 то смещение производится относительно начала файла; если origin равно 1, то относительно прежнейтекущей позиции; и относительно конца файла, если origin равно 2.Значение offset должно быть равно нулю или значению, полученномупри помощи функции ftell. Это единственный надежный способ получения величины offset для функции fseek.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 возвращаетненулевое значение.int feof (FILE *stream)feof возвращает ненулевое значение, если для потока stream установлениндикатор конца файла.void clearerr (FILE ∗stream)clearerr очищает индикаторы конца файла и ошибки потока stream.10.1.4 Математические функции63В головном файле <math.h> описываются следующие математическиефункции:double sin(double x)double cos(double x)double tan(double x)double asin(double x)double acos(double x)double atan(double x)double sinh(double x)double cosh(double x)double tanh(double x)double exp(double x)double log(double x)double log10(double x)double sqrt(double x)double fabs(double x)double pow(double x, double y)double ldexp(double x, int n)синус xкосинус xтангенс xарксинус x; x∈[-1,+1]арккосинус x; x∈[-1,+1]арктангенс xгиперболический синус xгиперболический косинус xгиперболический тангенс xэкспоненциальная функция exнатуральный логарифм ln(x), x>0десятичный логарифм log10(x), x>0квадратный корень √x, x≥0абсолютное значение |x|xyx*2n10.1.5 Функции общего назначенияФункции этого раздела предназначены для преобразования чисел и запроса памяти; они описаны в головном файле <stdlib.h>.double atof(const char *s)atof переводит строку s в значение double.
В случае переполнения выдает HUGE_VAL - некоторое положительное double-значение, определенное в головном файле <math.h>; при исчезновении порядка - нуль.int atoi(const char *s)atoi переводит строку s в значение int. В случае переполнения выдает(int)HUGE_VAL - некоторое положительное double-значение, определенное в головном файле <math.h>, преобразованное в int; приисчезновении порядка - нуль.void *calloc(size_t nobj, size_t size)calloc возвращает указатель на место в памяти, отведенное для массиваnobj объектов, каждый из которых имеет размер size. Выделенная область памяти обнуляется. Если память отвести не удалось, то результатработы функции - NULL.void *malloc(size_t size)malloc возвращает указатель на место в памяти для объекта размераsize.
Выделенная память не инициализируется. Если память отвести неудалось, то результат работы функции - NULL.void free(void *p)free освобождает область памяти, на которую указывает p; если p равноNULL, то функция ничего не делает. Значение p должно указывать на64область памяти, ранее выделенную с помощью функций calloc илиmalloc.10.1.6 Дальние переходыГоловной файл <setjmp.h> предоставляет средства для измененияобычной последовательности обработки вызовов функций: «вызов – возврат вточку вызова». Типичная ситуация, когда требуется отказаться от этой стратегии – необходимость вернуться из «глубоко вложенного» вызова функции наверхний уровень, минуя промежуточные возвраты.int setjmp (jmp_buf env)setjmp сохраняет контекст вызова в env для последующего его использования в longjmp.
Возвращает нуль, если возврат осуществляется непосредственно из setjmp, и значение val (которое должно быть отличным от нуля), есливозврат произошел из последующего вызова longjmp. Обращение к setjmp разумно только в определенных ситуациях: в основном, это проверки в if, swith ициклах в выражениях отношения видаif ( setjmp() = = 0 )/* после прямого возврата из setjmp */else/* после возврата из longjmp */void longjmp (jmp_buf env, int val)longjmp восстанавливает контекст, сохраненный в env при последнемвызове setjmp. Счет возобновляется, как если бы функция setjmp только что отработала и вернула ненулевое значение val. При этом переменныеимеют те значения, которые они имели в момент обращения к longjmp; функция setjmp значений объектов не сохраняет.
Результат непредсказуем, если в момент обращения к longjmp, функция, содержащая вызов setjmp, уже завершила свою работустандартным образом, вернув управление в точку вызова.10.2Фрагменты стандарта языка Си10.2.1 Классификация типовтипы ::= типы_данных | функциональные_типы | неполные_типытипы_данных ::= скалярные_типы | нескалярные_типыскалярные_типы ::= арифметические типы | указателиарифметические_типы ::= целочисленные_типы | плавающие_типыцелочисленные_типы ::= char| signed char | unsigned char | short | unsigned short| int | unsigned int | long | unsigned long | перечислимые типы |поля_битовплавающие_типы ::= float | double | long doubleуказатели ::= указатели_на_данные | указатели_на_функции | указатели_на_неполные_типы65нескалярные_типы ::= структуры | массивы | объединениянеполные_типы ::= неполные_структуры | неполные_массивы | неполные_объединения | void10.2.2 Приоритеты и порядок выполнения операцийоперациивыполняются--------------------------------------------------------------------------------------------------------------( ) [ ] → .