Что такое include stdio h
Что такое include stdio h
В приведенном ниже примере программа копирует символы, вводимые со стандартного ввода (клавиатуры), в указанный файл (файл задается первым параметром командной строки программы):
Использование fflush наиболее актуально при работе с текстовыми файлами, т.к. механизм буферизации откладывает запись в такой файл до получения символа конца строки (или до достижения конца буфера). Если приведенный выше пример модифицировать для копирования одного файла в другой, причем снабдить его прогрессом копирования (например, через каждые 1000 байт выводить символ *), то использование fflush становится обязательным, т.к. в противном случае звездочки прогресса будут выведены не по ходу копирования, а когда программа завершится или будет заполнен буфер.
Существует также набор простых процедур для ввода и вывода строк (под которыми понимается последовательность символов, завершаемая символом перевода строки). Эти процедуры удобно использовать в интерактивных программах, которые выполняют чтение с клавиатуры и вывод на экран терминала.
Приведенный ниже фрагмент программы содержит описание функции, возвращающей количество строк в указанном файле, при условии, что строки файла содержат не более 255 символов.
Примеры вызова функции printf :
Поле WIDTH определяет минимальное количество выводимых символов. При необходимости результат преобразования будет дополнен пробелами.
Поля WIDTH и PREC вместо числа могут содержать ‘*’, тогда в аргументах функции в соответствующем месте должен присутствовать целочисленный аргумент, значение которого и будет использоваться как параметр преобразования.
Примеры спецификаций:
Спецификация | Аргументы | Результат |
---|---|---|
%04X | i:integer=10 | |
j:integer=1000 | ||
%.3f | x:real=3.141592 | |
y:real=0.5 | ||
%+8.3G | x:real=3.141592 | |
y:real=-0.00005678 | ||
%.*Le | n:integer=2; x:extended=0.5 | |
m:integer=3; y:extended=1 | ||
%-*c%s | n:integer=3; c:char=’A’; s:pchar=’qwerty’ | |
m:integer=2; a:integer=64; s:pchar=’mail.ru’ |
Еще один комплексный пример:
Например, следующий оператор считывает очередное целое число из стандартного ввода:
Важно, что функции scanf передается адрес переменной i. Это необходимо для совместимости с языком Си, в котором параметры могут передаваться только по значению, а чтобы функция scanf изменяла переменную, которая находится в вызывающей процедуре, следует передать указатель, содержащий адрес этой переменной. Можно очень легко забыть про символ @, что приведет к ошибке записи в память. Нельзя также передавать неинициализированный указатель. Новичкам также приходится бороться с искушением помещать знак @ перед всеми указателями, такими как имена символьных массивов (pchar).
Поле WIDTH определяет максимальное количество символов входного потока, которое может быть использовано для преобразования по данной спецификации.
Если спецификация содержит знак ‘*’, это означает, что данной спецификации не требуется никакой аргумент, а результат преобразования нигде не будет сохранен.
Спецификация %[шаблон] определяет набор символов. До тех пор, пока очередной символ входного потока есть среди перечисленных в этом наборе, преобразование входного потока происходит по данной спецификации. Набор может задаваться простым перечислением символов: либо с использованием диапазонов: либо с использованием отрицания: Последний шаблон соответствует всем символам, кроме ‘a’, ‘b’ и ‘c’. Если требуется включить в шаблон символ ‘-‘, он должен стоять первым или последним символом шаблона. Если требуется включить в шаблон символ ‘^’, он должен стоять последним символом шаблона.
Примеры спецификаций:
Спецификация | Входной поток | Аргументы и результат |
---|---|---|
%d %2d %f %s | i:integer=11; j:integer=12; x:single=34.07; s1:array [0..N] of char=(‘k’,’e’,’i’,’t’,’h’,#0) | |
i:integer=123; j:integer=45; x:single=6; s1:array [0..N] of char=(‘4′,’.’,’7′,#0) | ||
%*d%1s%1c | s1:array [0..N] of char=(‘M’,’y’,#0); n:integer=2; s2:array [0..N] of char=(‘1′,’s’,’t’,’C’,’o’,’m’,’p’,#0) | s1:array [0..N] of char=(‘m’,’y’,’c’,’o’,’m’,’p’,#0); n:integer=6; s2:array [0..N] of char=(‘t’,’h’,’e’,’1′,’s’,’t’,#0) |
Еще один комплексный пример:
Что такое include stdio h
БлогNot. Лекции по C/C++: работа с файлами (stdio.h)
Лекции по C/C++: работа с файлами (stdio.h)
Параметр имя_файла может содержать относительный или абсолютный путь к открываемому файлу:
3) имя файла запрашивается у пользователя:
Параметр режим_доступа определяет, какие действия будут разрешены с открываемым файлом, примеры его возможных значений:
3) «at» – открываем текстовый файл для добавления данных в конец файла;
Фактически, указание «r» или «t» не накладывает каких-либо ограничений на методы, которые мы будем применять для чтения или записи данных.
После открытия файла следует обязательно проверить, удалась ли эта операция. Для этого есть 2 основных подхода:
1) стандартный обработчик ferror (см. пособиe, п.8.7);
Пример. Приложение проверяет, удалось ли открыть файл из текущей папки, имя файла запрашивается у пользователя (Visual Studio)
2) в начало файла (до всех #include ) включить директиву
Выбор способа чтения или записи данных зависит от того, какой должна быть структура файла.
Пример. Файл text.txt в текущей папке приложения имеет следующий вид:
Прочитаем его как последовательность вещественных чисел.
2. На «восприятие» программой данных может влиять установленная в приложении локаль. Например, если до показанного кода выполнен оператор результат работы кода может измениться (для русской локали разделителем целой и дробной части числа является запятая, а не точка).
3. Очередное чтение данных изменяет внутренний файловый указатель. Этот указатель в любой момент времени, пока файл открыт, показывает на следующее значение, которое будет прочитано. Благодаря этому наш код с «бесконечным» while не зациклился.
4. Код показывает, как читать из файла заранее неизвестное количество значений – это позволяет сделать стандартная функция feof (проверка, достигнут ли конец файла; вернёт не 0, если прочитано всё).
5. Распространённый в примерах из Сети код вида
в ряде компиляторов может породить неточности при интерпретации данных. Например, этот код может прочитать как последнее значение завершающий перевод строки в файле, благодаря чему последнее прочитанное значение «удвоится».
В качестве примера форматной записи в файл сохраним массив a из 10 целочисленных значений в файле с именем result.txt по 5 элементов в строке:
Как и в случае с функциями для чтения форматированных данных, у всех этих методов имеются аналоги для работы со стандартным вводом/выводом.
Пример. Читая файл, определить длину каждой строки в символах. Для решения задачи воспользуемся тем фактом, что строки завершаются символом «перевод строки» ( ‘\n’ ). Предполагается, что файл уже открыт для чтения.
Пример. Читаем построчно файл с известной максимальной длиной строки. Предполагается, что файл уже открыт для чтения.
Пример. Целочисленный массив a запишем в двоичный файл.
Учитывая, что данные массива хранятся в последовательно идущих адресах памяти, цикл for для записи мы могли заменить одним оператором:
Подход к чтению данных с помощью fread аналогичен. Например, если файл уже открыт для чтения в режиме «rb»:
Пример. Определить размер файла в байтах, предположим, что файл уже открыт в режиме чтения или произвольного доступа.
Материал для чтения из пособия: пп. 8.6-8.11. Обратите внимание на таблицы с описанными прототипами функций ввода/вывода.
Рекомендуемые задачи: базовое задание включает две задачи, первая из которых предполагает обработку файла как текстовых данных, вторая – как бинарных. В качестве дополнительной третьей задачи может быть предложена реализация одной из задач 1, 2, содержащая консольный интерфейс и меню.
Про conio.h и почему его не надо использовать:
Stdio.h
stdio.h
stdio.h (от англ. standard input/output header — стандартный заголовочный файл ввода/вывода) заголовочный файл стандартной библиотеки языка Си, содержащий определения макросов, константы и объявления функций и типов, используемых для различных операций стандартного ввода и вывода. Функциональность унаследована от «портативного пакета ввода/вывода» («portable I/O package»), написанного Майком Леском из Bell Labs в начале 1970-х. [1] C++ ради совместимости, также использует stdio.h наряду со схожим по функциональности заголовочным файлом cstdio.
Содержание
Пример использования
Все функции в языке Си (и его многочисленных разновидностей) объявляются в заголовочных файлах. Таким образом, программистам приходится подключать файл stdio.h к исходному коду, чтобы использовать функции, объявленные в нем.
Программа, приведенная выше, считывает всю входящую информацию из стандартного ввода и выводит ее побайтно на стандартный вывод, добавляя символ перевода строки в конец вывода.
Функции-члены
Функции, объявленные в stdio.h в общем случае могут быть разделены на две категории: функции для операций с файлами и функции для операций ввода-вывода.
Имя | Примечания |
---|---|
Функции для файловых операций | |
fclose | закрывает файл, ассоциированный с переданным ей значением FILE * |
fopen, freopen, fdopen | открывают файл для определенных типов чтения и записи |
remove | удаляет файл (стирая его) |
rename | переименовывает файл |
rewind | работает аналогично fseek(stream, 0L, SEEK_SET), вызванному для потока, со сбросом индикатора ошибок |
tmpfile | создает и открывает временный файл, удаляемый при закрытии через fclose() |
Функции для операций ввода-вывода | |
clearerr | очищает EOF и индикаторы ошибок для данного потока |
feof | проверяет, установлен ли индикатор EOF для данного потока |
ferror | проверяет, установлен ли индикатор ошибок для данного потока |
fflush | принудительно записывает вывод, предназначенный для помещения в буфер, в файл, ассоциированный с данным потоком |
fgetpos | сохраняет позицию указателя файла потока, ассоциированный с его первым аргументом (FILE *), в его второй аргумент (fpos_t *) |
fgetc | возвращает один символ из файла |
fgets | получает строку из файла (оканчивающуюся символом перевода строки или конца файла) |
fputc | записывает один символ в файл |
fputs | записывает строку в файл |
ftell | возвращает указатель позиции файла, который может быть передан fseek |
fseek | производит смещение от текущей позиции в файле на указанное количество байт,или от его начала или конца, в указаном направление. |
fsetpos | устанавливает указатель позиции файла потока, ассоциированный с его первым аргументом (FILE *), как хранимый во втором его аргументе (fpos_t *) |
fread | читает данные из файла |
fwrite | записывает данные в файл |
getc | считывает и возвращает символ из данного потока и изменяет указатель позиции файла; позволяет использоваться как макрос с теми же эффектами, что и fgetc, кроме того, что может вычислять поток более одного раза |
getchar | имеет аналогичный эффект, что и getc(stdin) |
gets | считывает символы из stdin до символа перевода строки и хранит их в своем единственном аргументе |
printf, vprintf | используются для вывода в стандартный поток вывода |
fprintf, vfprintf | используются для вывода в файл |
sprintf, snprintf, vsprintf | используются для вывода в массив типа char (Строка в языке Си) |
perror | записывает сообщение об ошибке в stderr |
putc | записывает и возвращает символ в поток и изменяет указатель позиции файла на него; можно использовать как макрос с теми же свойствами, что и fputc, кроме того, что он может обрабатывать поток более одного раза |
putchar, fputchar | аналогичны putc(stdout) |
scanf, vscanf | используются для ввода из стандартного потока ввода |
fscanf, vfscanf | используются для ввода из файла |
sscanf, vsscanf | используются для ввода из массива char (то есть Строка в языке Си) |
setbuf | |
setvbuf | устанавливает режим буферизации для данного потока |
tmpnam | создает временное имя файла |
ungetc | помещает символ обратно в поток |
puts | выводит символьную строку в stdout |
Константы-члены
Следующие константы определены в заголовочном файле stdio.h :
Переменные-члены
Следующие переменные опеределены в заголовочном файле stdio.h :
Типы членов
Типы данных, определенные в заголовочном файле stdio.h содержат:
Что такое include stdio h
Настоящее приложение представляет собой краткое изложение библиотеки, утвержденной в качестве ANSI-стандарта. Сама по себе библиотека не является частью языка, однако, заложенный в ней набор функций, а также определений типов и макросов составляет системную среду, поддерживающую стандарт Си. Мы не приводим здесь несколько функций с ограниченной областью применения – те, которые легко синтезируются из других функций, а также опускаем все то, что касается многобайтовых символов и специфики, обусловленной языком, национальными особенностями и культурой.
Функции, типы и макросы объявляются в следующих стандартных заголовочных файлах:
Доступ к заголовочному файлу осуществляется с помощью строки препроцессора
Заголовочные файлы можно включать в любом порядке и сколько угодно раз. Строка #include не должна быть внутри внешнего объявления или определения и должна встретиться раньше, чем что-нибудь из включаемого заголовочного файла будет востребовано. В конкретной реализации заголовочный файл может и не быть исходным файлом.
Внешние идентификаторы, начинающиеся со знака подчеркивания, а также все другие идентификаторы, начинающиеся с двух знаков подчеркивания или с подчеркивания и заглавной буквы, зарезервированы для использования в библиотеке.
B1. Ввод-вывод:
Определенные в функции ввода-вывода, а также типы и макросы составляют приблизительно одну треть библиотеки.
Поток соединяется с файлом или устройством посредством его открытия, указанная связь разрывается путем закрытия потока. Открытие файла возвращает указатель на объект типа FILE, который содержит всю информацию, необходимую для управления этим потоком. Если не возникает двусмысленности, мы будем пользоваться терминами «файловый указатель» и «поток» как равнозначными.
Когда программа начинает работу, уже открыты три потока: stdin, stdout и stderr.
B1.1. Операции над файлами
fopen открывает файл с заданным именем и возвращает поток или NULL, если попытка открытия оказалась неудачной. Режим mode допускает следующие значения:
Режим «исправления» позволяет читать и писать в один и тот же файл; при переходах от операций чтения к операциям записи и обратно должны осуществляться обращения к fflush или к функции позиционирования файла. Если указатель режима дополнить буквой b (например «rb» или «w+b»), то это будет означать, что файл бинарный. Ограничение на длину имени файла задано константой FILENAME_MAX. Константа FOPEN_MAX ограничивает число одновременно открытых файлов.
freopen открывает файл с указанным режимом и связывает его с потоком stream. Она возвращает stream или, в случае ошибки, NULL. Обычно freopen используется для замены файлов, связанных с stdin, stdout или stderr, другими файлами.
Применяемая к потоку вывода функция fflush производит дозапись всех оставшихся в буфере (еще не записанных) данных, для потока ввода эта функция не определена. Возвращает EOF в случае возникшей при записи ошибки или нуль в противном случае. Обращение вида fflush(NULL) выполняет указанные операции для всех потоков вывода.
fсlose производит дозапись еще не записанных буферизованных данных, сбрасывает несчитанный буферизованный ввод, освобождает все автоматически запрошенные буфера, после чего закрывает поток. Возвращает EOF в случае ошибки и нуль в противном случае.
remove удаляет файл с указанным именем; последующая попытка открыть файл с этим именем вызовет ошибку. Возвращает ненулевое значение в случае неудачной попытки.
tmpfile создает временный файл с режимом доступа «wb+», который автоматически удаляется при его закрытии или обычном завершении программой своей работы. Эта функция возвращает поток или, если не смогла создать файл, NULL.
tmpnam(NULL) создает строку, не совпадающую ни с одним из имен существующих файлов, и возвращает указатель на внутренний статический массив. tmpnam(s) запоминает строку в s и возвращает ее в качестве значения функции; длина s должна быть не менее L_tmpnam. При каждом вызове tmpnam генерируется новое имя; при этом гарантируется не более TMPMAX различных имен за один сеанс работы программы. Заметим, что tmpnam создает имя, а не файл.
Если buf есть NULL, то для потока stream буферизация выключается. В противном случае вызов setbuf приведет к тем же действиям, что и вызов (void) setvbuf (stream, buf, _IOFBF, BUFSIZ).
B1.2. Форматный вывод
Функции printf осуществляют вывод информации по формату.
Форматная строка содержит два вида объектов: обычные символы, копируемые в выводной поток, и спецификации преобразования, которые вызывают преобразование и печать остальных аргументов в том порядке, как они перечислены. Каждая спецификация преобразования начинается с % и заканчивается символом-спецификатором преобразования. Между % и символом- спецификатором в порядке, в котором они здесь перечислены, могут быть расположены следующие элементы информации:
Ширина, или точность, или обе эти характеристики могут быть специфицированы с помощью *; в этом случае необходимое число «извлекается» из следующего аргумента, который должен иметь тип int (в случае двух звездочек используются два аргумента).
Символы-спецификаторы и разъяснение их смысла приведены в таблице B-1. Если за % нет правильного символа-спецификатора, результат не определен.
sprintf действует так же, как и printf, только вывод осуществляет в строку s, завершая ее символом ‘\0’. Строка s должна быть достаточно большой, чтобы вмещать результат вывода. Возвращает количество записанных символов, в число которых символ ‘\0’ не входит.
Функции vprintf, vfprintf и vsprintf эквивалентны соответствующим printf— функциям с той лишь разницей, что переменный список аргументов представлен параметром arg, инициализированным макросом va_start и, возможно, вызовами va_arg (см. в B7 описание ).
Таблица B-1. Преобразования printf
B1.3. Форматный ввод
Функции scanf имеют дело с форматным преобразованием при вводе
fscanf читает данные из потока stream под управлением format и преобразованные величины присваивает по порядку аргументам, каждый из которых должен быть указателем. Завершает работу, если исчерпался формат. Выдает EOF по исчерпании файла или перед любым преобразованием, если возникла ошибка; в остальных случаях функция возвращает количество преобразованных и введенных элементов.
Форматная строка обычно содержит спецификации преобразования, которые используются для управления вводом. В форматную строку могут входить:
Спецификация преобразования определяет преобразование следующего поля ввода. Обычно результат размещается в переменной, на которую указывает соответствующий аргумент. Однако если присваивание подавляется с помощью знака *, как, например, в %*s, то поле ввода просто пропускается, и никакого присваивания не происходят. Поле ввода определяется как строка символов, отличных от символов-разделителей; при этом ввод строки прекращается при выполнении любого из двух условий: если встретился символ-разделитель или если ширина поля (в случае, когда она указана) исчерпана. Из этого следует, что при переходе к следующему полю scanf может «перешагивать» через границы строк, поскольку символ новой строки является символом-разделителем. (Под символами-разделителями понимаются символы пробела, табуляции, новой строки, возврата каретки, вертикальной табуляции и смены страницы.)
Символ-спецификатор указывает на способ интерпретации поля ввода. Соответствующий аргумент должен быть указателем. Список допустимых символов-спецификаторов приводится в таблице B-2.
Таблица B-2. Преобразования scanf
Символ | Данные на вводе; тип аргумента |
---|---|
d | десятичное целое; int * |
i | целое: int *. Целое может быть восьмеричным (с нулем слева) или шестнадцатеричным (с 0x или 0X слева) |
o | восьмеричное целое (с нулем слева или без него); int * |
u | беззнаковое десятичное целое; unsigned int * |
x | шестнадцатеричное целое (с 0x или 0X слева или без них): int * |
c | символы, char *. Символы ввода размещаются в указанном массиве в количестве, заданном шириной поля; по умолчанию это количество равно 1. Символ’\0′ не добавляется. Символы-разделители здесь рассматриваются как обычные символы и поступают в аргумент. Чтобы прочесть следующий символ-разделитель, используйте %1s |
s | строка символов, отличных от символов-разделителей (записывается без кавычек); char *, указывающий на массив размера достаточного, чтобы вместить строку и добавляемый к ней символ ‘\0’ |
e, f, g | число с плавающей точкой; float *. Формат ввода для float состоит из необязательного знака, строки цифр, возможно с десятичной точкой, и необязательного порядка, состоящего из E или e и целого, возможно со знаком |
p | значение указателя в виде, в котором printf («%р») его напечатает; void * |
n | записывает в аргумент число символов, прочитанных к этому моменту в этом вызове; int *. Никакого чтения ввода не происходит. Счетчик числа введенных элементов не увеличивается |
[. ] | выбирает из ввода самую длинную непустую строку, состоящую из символов, заданных в квадратных скобках: char *. В конец строки добавляется ‘\0’. Спецификатор вида []. ] включает ] в задаваемое множество символов |
[^. ] | выбирает из ввода самую длинную непустую строку, состоящую из символов, не входящих в заданное в скобках множество. В конец добавляется ‘\0’. Спецификатор вида [^]. ] включает ] в задаваемое множество символов |
% | обычный символ %; присваивание не делается |
B1.4. Функции ввода-вывода символов
fgetc возвращает следующий символ из потока stream в виде unsigned char (переведенную в int) или EOF, если исчерпан файл или обнаружена ошибка.
fgets читает не более n-1 символов в массив s, прекращая чтение, если встретился символ новой строки, который включается в массив; кроме того, записывает в массив ‘\0’. Функция fgets возвращает s или, если исчерпан файл или обнаружена ошибка, NULL.
fputc пишет символ c (переведенный в unsigned char) в stream. Возвращает записанный символ или EOF в случае ошибки.
fputs пишет строку s (которая может не иметь ‘\n’ ) в stream; возвращает неотрицательное целое или EOF в случае ошибки.
getchar() делает то же, что getc(stdin).
gets читает следующую строку ввода в массив s, заменяя символ новой строки на ‘\0’. Возвращает s или, если исчерпан файл или обнаружена ошибка, NULL.
putchar(c) делает тоже, что putc(c, stdout).
puts пишет строку s и символ новой строки в stdout. Возвращает EOF в случае ошибки, или неотрицательное значение, если запись прошла нормально.
ungetc отправляет символ c (переведенный в unsigned char) обратно в stream; при следующем чтении из stream он будет получен снова. Для каждого потока вернуть можно не более одного символа. Нельзя возвращать EOF. В качестве результата ungetc выдает отправленный назад символ или, в случае ошибки, EOF.
B1.5. Функции прямого ввода-вывода
fread читает из потока stream в массив ptr не более nobj объектов размера size. Она возвращает количество прочитанных объектов, которое может быть меньше заявленного. Для индикации состояния после чтения следует использовать feof и ferror.
fwrite пишет из массива ptr в stream nobj объектов размера size; возвращает число записанных объектов, которое в случае ошибки меньше nobj.
B1.6. Функции позиционирования файла
rewind(fp) делает то же, что и fseek(fp, 0L, SEEK_SET); clearerr(fp).
fgetpos записывает текущую позицию потока stream в *ptr для последующего использования ее в fsetpos. Тип fpos_t позволяет хранить такого рода значения, В случае ошибки fgetpos возвращает ненулевое значение.
fsetpos устанавливает позицию в stream, читая ее из *ptr, куда она была записана ранее с помощью fgetpos. В случае ошибки fsetpos возвращает ненулевое значение.
B1.7. Функции обработки ошибок
Многие функции библиотеки в случае ошибки или конца файла устанавливают индикаторы состояния. Эти индикаторы можно проверять и изменять. Кроме того, целое выражение errno (объявленное в ) может содержать номер ошибки, который дает дополнительную информацию о последней из обнаруженных ошибок.
clearerr очищает индикаторы конца файла и ошибки потока stream.
feof возвращает ненулевое значение, если для потока stream установлен индикатор конца файла.
ferror возвращает ненулевое значение, если для потока stream установлен индикатор ошибки.
perror(s) печатает s и зависимое от реализации сообщение об ошибке, соответствующее целому значению в errno, т. е. делает то же, что и обращение к функции fprintf вида
B2. Проверки класса символа:
Заголовочный файл объявляет функции, предназначенные для проверок символов. Аргумент каждой из них имеет тип int и должен либо представлять собой EOF, либо быть значением unsigned char, приведенным к int; возвращаемое значение тоже имеет тип int. Функции возвращают ненулевое значение («истина»), когда аргумент c удовлетворяет описанному условию или принадлежит указанному классу символов, и нуль в противном случае.
isalnum(c) | isalpha(c) или isdigit(c) есть истина |
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 (‘ ‘) до 0x7E (‘
Помимо перечисленных есть две функции, приводящие буквы к одному из регистров:
B3. Функции, оперирующие со строками:
Последовательные вызовы strtok разбивают строку s на лексемы. Ограничителем лексемы служит любой символ из строки ct. В первом вызове указатель s не равен NULL. Функция находит в строке s первую лексему, состоящую из символов, не входящих в ct; ее работа заканчивается тем, что поверх следующего символа пишется ‘\0’ и возвращается указатель на лексему. Каждый последующий вызов, в котором указатель s равен NULL, возвращает указатель на следующую лексему, которую функция будет искать сразу за концом предыдущей. Функция strtok возвращает NULL, если далее никакой лексемы не обнаружено. Параметр ct от вызова к вызову может варьироваться.
Здесь и ниже под такими выражениями как cs 0, если cs>ct (I.B.: вообще-то, функция возвращает int)
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) | возвращает указатель на первое вхождение символа c в cs или, если среди первых n символов c не встретилось, NULL |
void *memset(s, c, n) | размещает символ c в первых n позициях строки s и возвращает s |
B4. Математические функции:
В заголовочном файле описываются математические функции и определяются макросы.
B5. Функции общего назначения:
Заголовочный файл объявляет функции, предназначенные для преобразования чисел, запроса памяти и других задач.
atof переводит s в double; эквивалентна strtod(s, (char**) NULL).
atoi переводит s в int; эквивалентна (int)strtol(s, (char**)NULL, 10).
atol переводит s в long; эквивалентна strtol(s, (char**) NULL, 10).
strtod преобразует первые символы строки s в double, игнорируя начальные символы-разделители; запоминает указатель на непреобразованный конец в *endp (если endp не NULL), при переполнении она выдает HUGE_VAL с соответствующим знаком, в случае, если результат оказывается меньше, чем возможно представить данным типом, возвращается 0; в обоих случаях в errno устанавливается ERANGE.
rand выдает псевдослучайное число в диапазоне от 0 до RAND_MAX; RAND_MAX не меньше 32767.
srand использует seed в качестве семени для новой последовательности псевдослучайных чисел. Изначально параметр seed равен 1.
calloc возвращает указатель на место в памяти, отведенное для массива nobj объектов, каждый из которых размера size, или, если памяти запрашиваемого объема нет, NULL. Выделенная область памяти обнуляется.
malloc возвращает указатель на место в памяти для объекта размера size или, если памяти запрашиваемого объема нет, NULL. Выделенная область памяти не инициализируется.
realloc заменяет на size размер объекта, на который указывает p. Для части, размер которой равен наименьшему из старого и нового размеров, содержимое не изменяется. Если новый размер больше старого, дополнительное пространство не инициализируется, realloc возвращает указатель на новое место памяти или, если требования не могут быть удовлетворены, NULL (*p при этом не изменяется).
free освобождает область памяти, на которую указывает p; эта функция ничего не делает, если p равно NULL. В p должен стоять указатель на область памяти, ранее выделенную одной из функций: calloc, malloc или realloc.
abort вызывает аварийное завершение программы, ее действия эквивалентны вызову raise(SIGABRT).
exit вызывает нормальное завершение программы. Функции, зарегистрированные с помощью atexit, выполняются в порядке, обратном их регистрации. Производится опорожнение буферов открытых файлов, открытые потоки закрываются, и управление возвращается в среду, из которой был произведен запуск программы. Значение status, передаваемое в среду, зависит от реализации, однако при успешном завершении программы принято передавать нуль. Можно также использовать значения EXIT_SUCCESS (в случае успешного завершения) и EXIT_FAILURE (в случае ошибки).
atexit регистрирует fcn в качестве функции, которая будет вызываться при нормальном завершении программы; возвращает ненулевое значение, если регистрация не может быть выполнена.
system пepeдaeт cтpoку s oпepaциoннoй cpeдe для выпoлнeния. Если s есть NULL и существует командный процессор, то system возвращает ненулевое значение. Если s не NULL, то возвращаемое значение зависит от реализации.
getenv возвращает строку среды, связанную с name, или, если никакой строки не существует, NULL. Детали зависят от реализации.
bsearch ищет среди base[0]. base[n-1] элемент с подходящим ключом *key. Функция cmp должна сравнивать первый аргумент (ключ поиска) со своим вторым аргументом (значением ключа в таблице) и в зависимости от результата сравнения выдавать отрицательное число, нуль или положительное значение. Элементы массива base должны быть упорядочены в возрастающем порядке, bsearch возвращает указатель на элемент с подходящим ключом или, если такого не оказалось, NULL.
abs возвращает абсолютное значение аргумента типа int.
labs возвращает абсолютное значение аргумента типа long.
div вычисляет частное и остаток от деления num на denom. Результаты типа int запоминаются в элементах quot и rem структуры div_t.
ldiv вычисляет частное и остаток от деления num на denom. Результаты типа long запоминаются в элементах quot и rem структуры ldiv_t.
B6. Диагностика:
Макрос assert используется для включения в программу диагностических сообщений.
Если выражение имеет значение нуль, то
напечатает в stderr сообщение следующего вида:
после чего будет вызвана функция abort, которая завершит вычисления. Имя исходного файла и номер строки будут взяты из макросов __FILE__ и __LINE__.
Если в момент включения файла было определено имя NDEBUG, то макрос assert игнорируется.
B7. Списки аргументов переменной длины:
Прежде чем будет возможен доступ к безымянным аргументам, необходимо один раз инициализировать ap, обратившись к макросу va_start:
С этого момента каждое обращение к макросу:
будет давать значение очередного безымянного аргумента указанного типа, и каждое такое обращение будет вызывать автоматическое приращение указателя ap, чтобы последний указывал на следующий аргумент. Один раз после перебора аргументов, но до выхода из f необходимо обратиться к макросу
B8. Дальние переходы:
longjmp восстанавливает информацию, сохраненную в самом последнем вызове setjmp, по информации из env; выполнение программы возобновляется, как если бы функция setjmp только что отработала и вернула ненулевое значение val. Результат будет непредсказуемым, если в момент обращения к longjmp функция, содержащая вызов setjmp, уже «отработала» и осуществила возврат. Доступные ей объекты имеют те значения, которые они имели в момент обращения к longjmp; setjmp не сохраняет значений.
B9. Сигналы:
Заголовочный файл предоставляет средства для обработки исключительных ситуаций, возникающих во время выполнения программы, таких как прерывание, вызванное внешним источником или ошибкой в вычислениях.
signal устанавливает, как будут обрабатываться последующие сигналы. Если параметр handler имеет значение SIG_DFL, то используется зависимая от реализации «обработка по умолчанию»; если значение handler равно SIG_IGN, то сигнал игнорируется; в остальных случаях будет выполнено обращение к функции, на которую указывает handler с типом сигнала в качестве аргумента. В число допустимых видов сигналов входят:
SIGABRT | — аварийное завершение, например от abort; |
SIGFPE | — арифметическая ошибка: деление на 0 или переполнение; |
SIGILL | — неверный код функции (недопустимая команда); |
SIGINT | — запрос на взаимодействие, например прерывание; |
SIGSEGV | — неверный доступ к памяти, например выход за границы; |
SIGTERM | — требование завершения, посланное в программу. |
signal возвращает предыдущее значение handler в случае специфицированного сигнала, или SIGERR в случае возникновения ошибки.
Когда в дальнейшем появляется сигнал sig, сначала восстанавливается готовность поведения «по умолчанию», после чего вызывается функция, заданная в параметре handler, т.е. как бы выполняется вызов (*handler)(sig). Если функция handler вернет управление назад, то вычисления возобновятся с того места, где застал программу пришедший сигнал. Начальное состояние сигналов зависит от реализации.
raise посылает в программу сигнал sig. В случае неудачи возвращает ненулевое значение.
B10. Функции даты и времени:
Следующие четыре функции возвращают указатели на статические объекты, каждый из которых может быть изменен другими вызовами.
asctime переводит время в структуре *tp в строку вида
ctime переводит календарное время в местное, что эквивалентно выполнению asctime(localtime(tp))
localtime переводит календарное время *tp в местное.
strftime форматирует информацию о дате и времени из *tp в строку s согласно формату fmt, который имеет много общих черт с форматом, задаваемым в функции printf. Обычные символы (включая и завершающий символ ‘\0’) копируются в s. Каждая пара, состоящая из % и буквы, заменяется, как показано ниже, с использованием значений по форме, соответствующей местным традициям. В s размещается не более smax символов; strftime возвращает число символов без учета ‘\0’ или нуль, если число сгенерированных символов больше smax.
B11. Зависящие от реализации пределы: и
Заголовочный файл определяет константы для размеров целочисленных типов. Ниже перечислены минимальные приемлемые величины, но в конкретных реализациях могут использоваться и большие значения.
Имена, приведенные в следующей таблице, взяты из и являются константами, имеющими отношение к арифметике с плавающей точкой. Значения (если они есть) представляют собой минимальные значения для соответствующих величин. В каждой реализации устанавливаются свои значения.