Вперед Назад Содержание

1. Стандартные Вспомогательные Функции (stdlib.h)

В этой главе описаны вспомогательные функции, которые могут быть использованы в разнообразных программах. Соответствующие описания содержатся в файле stdlib.h.

1.1 abort - ненормальное завершение программы

#include <stdlib.h> void abort(void);
Используйте abort для того, чтобы показать, что программа встретила препятствие, из-за которого она не может работать. Обычно эта функция заканчивает исполнение программы.

Перед завершением программы abort генерирует сигнал sigabrt (используя raise(sigabrt)).

Если Вы использовали signal для установки обработчика данного сигнала, то этот обработчик может взять управление на себя, предотвратив прекращение работы программы.

abort не выполняет каких-либо действий, связанных с очисткой потоков или файлов (это может сделать среда, в которой работает программа; если она этого не делает, то Вы можете организовать для своей программы свою собственную очистку при помощи обработчика сигнала sigabrt).

abort не возвращает yпpавление вызвавшей программе.

Стандарт ANSI требует наличия процедуры abort.

Требуются процедуры ОС getpid и kill.

1.2 abs - модуль целого числа

#include <stdlib.h> int abs(int i);
abs возвращает модуль (абсолютное значение) i. Таким образом, если i отрицательно, то результат противоположен i, а если i неотрицательно, то в результате будет i.

Похожая функция labs используется для возвращения значений типа long, а не int.

Резyльтат является неотpицательным целым.

Стандарт ANSI требует наличия функции abs.

Не требуется никаких пpоцедyp ОС.

1.3 assert - макроопределение для вывода отладочных диагностических сообщений

#include <assert.h> #include <stdlib.h> void assert(int expression);
Используйте это макро для включения в программу диагностических операторов. Аpгyмент expression должен быть выражением, которое принимает значение истина (не ноль), если программа работает так, как Вы предполагаете.

Когда expression ложно (ноль), assert вызывает abort, предварительно выведя сообщение, показывающие, какая и где произошла ошибка:

assertion failed: expression, file filename, line lineno
Вы можете исключить все использования assert во время компиляции, определив NDEBUG как переменную препроцессора. Если это сделано, то макро assert превращается в

(void(0))
assert не возвращает yпpавление вызвавшей программе.

assert, так же как и его поведение при определении NDEBUG, определяется стандартом ANSI.

Требуются процедуры ОС (только если использования assert не исключены) close, fstat, getpid, isatty, kill, lseek, read, sbrk, write.

1.4 atexit - запрос вызова функции при завершении работы программы

#include <stdlib.h> int atexit(void (*function)(void);
Функция atexit может использоваться для внесения функции в список функций, которые будут вызваны при нормальном завершении программы. Аргумент является указателем на определенную пользователем функцию, которая не требует аргументов и не возвращает значений.

Эти функции помещаются в lifo-стек; таким образом последняя из перечисленных функций будет выполнена первой при выходе из программы.

Не предусмотрено никаких ограничений на количество внесенных в этот список функций; после внесения каждых 32 функций в список, atexit вызывает malloc для выделения памяти под следующую часть списка. Место для первых 32 элементов списка выделяется статически, так что Вы всегда можете рассчитывать на то, что по крайней мере 32 функции могут быть внесены в список.

atexit возвращает 0, если удалось внести Вашу функцию в список, и -1, в случае ошибки (возникает только в случае, если нет памяти для расширения списка посредством функции malloc).

Стандарт ANSI требует наличия функции atexit и определяет безусловную возможность внесения в список по крайней мере 32 функций.

Требуются пpоцедypы ОС close, fstat, isatty, lseek, read, sbrk, write.

1.5 atof, atoff - преобразование строки в значение типа double или float

#include <stdlib.h> double atof(const char *s); float atoff(const char *s);
atof преобразует начальную часть строки в double, atoff - в float.

Эта функция разбирает строку символов s, выделяя подстроку, которая может быть преобразована в число с плавающей точкой. Эти подстроки должны удовлетворять формату

[+|-]digits[.][digits][(E|e)[+|-]digits]
Переводится наиболее длинный начальный кусок s, который имеет указанный формат, начинающийся с первого отличного от пробела знака. Подстрока считается пустой, если str пусто, состоит только из пробелов или первый отличный от пробела знак не является `+', `-', `.' или цифрой.

atof(s) реализовано как strtod(s, NULL). atoff(s) - как strtodf(s, NULL).

atof возвращает значение преобразованной подстроки, если она есть, как double; или 0.0, если никакого преобразования не было выполнено. Если правильное значение вышло за границы представляемых значений, то возвращается плюс или минус huge_val и в errno записывается erange. Если правильное значение слишком мало, то возвращается 0.0 и erange сохраняется в errno.

atoff подчиняется тем же правилам, что и atof, за исключением того, что выдает float.

Стандарт ANSI требует наличия функции atof. atof, atoi и atol относятся к тому же типу, что и strod и strol, но интенсивно используются в существующих программах. Эти функции менее надежны, но могут исполняться быстрее, если известно, что аргумент находится в допустимом диапазоне.

Требуются процедуры ОС close, fstat, isatty, lseek, read, sbrk, write.

1.6 atoi, atol - строка в целое

#include <stdlib.h> int atoi(const char *s); long atol(const char *s);
atoi преобразовывает начальный фрагмент строки в int, а atol - в long.

atoi(s) реализован как (int)strtol(s, NULL, 10),а atol(s) - как strtol(s, NULL, 10).

Эти функции возвращают преобразованное значение, если оно есть. Если никакого преобразования не было выполнено, то возвращается 0.

Стандарт ANSI требует наличия функции atoi.

Никаких процедур ОС не требуется.

1.7 atol - преобразовывает строку в long

long atol(const char *s);
atol преобразовывает начальный фрагмент строки в long.

atol(s) реализован как strtol(s,NULL,10).

Стандарт ANSI требует наличия функции atol.

Никаких процедур ОС не требуется.

1.8 bsearch - двоичный поиск

#include <stdlib.h> void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
bsearch выполняет поиск в массиве, начало которого определяется параметром base, элемента, сравнимого с key, используя бинарный поиск. nmemb - число элементов в массиве, size - размер каждого элемента.

Массив должен быть отсортирован в возрастающем порядке относительно функции сравнения compar (которая передается как последний аргумент bsearch).

Вы должны определить функцию сравнения (*compar), имеющую два аргумента; ее результат должен быть отрицательным, если первый аргумент меньше второго, ноль, если оба аргумента совпадают и положительным, если первый аргумент больше второго (где "меньше" и "больше" относятся к произвольному подходящему порядку).

Эта функция возвращает указатель на элемент array, который сравним с key. Если подходящих элементов несколько, то результат может быть указателем на любой из них.

Стандарт ANSI требует наличия функции bsearch.

Никаких процедур ОС не требуется.

1.9 calloc - выделяет пространство для массивов

#include <stdlib.h> void *calloc(size_t n, size_t s); void *calloc_r(void *reent, size_t <n>, <size_t> s);
calloc запрашивает блок памяти, достаточный для хранения массива из n элементов, каждый из которых имеет размер s.

Выделяемая при помощи calloc память берется из области, используемой malloc, но блоки памяти при инициализации заполняются нулями. (Для избежания накладных расходов вpемени для инициализации выделяемой памяти использyйте malloc.)

Другая функция _calloc_r является повторно-входимым аналогом. Дополнительный аргумент reent - указатель на структуру, содержащую информацию для обеспечения повторной входимости.

В случае успешного выполнения функции выдается указатель на выделенное пространство, в противном случае возвращается NULL.

Стандарт ANSI требует наличия функции calloc.

Требуются процедуры ОС close, fstat, isatty, lseek, read, sbrk, write.

1.10 div - деление двух целых

#include <stdlib.h> div_t div(int n, int d);
Делит n на d, возвращая целые частное и остаток в структуре div_t.

Результат представляется при помощи структуры

typedef struct { int quot; int rem; } div_t;
где поле quot представляет отношение, а rem - остаток. Для ненулевого d, если r = div(n,d), то n равно r.rem + d*r.quot.

Когда d равно 0, поле quot результата имеет тот же знак, что и n и наибольшее представимое его типом значение.

Для деления значений типа long, а не int, используйте похожую функцию ldiv.

Стандарт ANSI требует наличия функции div, но обработка нулевого d не определена стандартом.

Никаких процедур ОС не требуется.

1.11 ecvt, ecvtf, fcvt, fcvtf - преобразование double или float в строку

#include <stdlib.h> char *ecvt(double val, int chars, int *decpt, int *sgn); char *ecvtf(float val, int chars, int *decpt, int *sgn); char *fcvt(double val, int decimals, int *decpt, int *sgn); char *fcvtf(float val, int decimals, int *decpt, int *sgn);
ecvt и fcvt выдают оканчивающиеся на NULL строки цифр, представляющих число val типа double. ecvtf и fcvtf выдают соответствующее знаковое представление значений типа float.

(Функции stdlib ecvtbuf и fcvtbuf - другие версии ecvt и fcvt.)

Единственнон отличие между ecvt и fcvt состоит в интерпретации второго аргумента (chars или decimals). Для ecvt второй аргумент chars определяет общее число выводимых знаков (которое является также числом значащих знаков в форматированной строке, поскольку эти функции выводят только цифры). Для fcvt второй аргумент decimals определяет число знаков после десятичной точки, все знаки целых частей val выводятся всегда.

Поскольку ecvt и fcvt выводят только цифры в выводимой строке, то они записывают место десятичной точки в *decpt, а знак числа - в *sgn. После форматирования числа *decpt содержит число знаков слева от десятичной точки, а *sgn содержит 0, если число положительно, и 1, если число отрицательно.

Все четыре функции возвращают указатель на строку, содержащую текстовое представление val.

Ни одна из этих функций не определена в ANSI C.

Требуются пpоцедypы ОС close, fstat, isatty, lseek, read, sbrk, write.

1.12 gvcvt, gcvtf - форматируют double и float как строку

#include <stdlib.h> char *gcvt(double val, int precision, char *buf); char *gcvtf(float val, int precision, char *buf);
gcvt записывает полностью отформатированное число как оканчивающуюся на NULL строку в буфер *buf. gdvtf выдает соответствующие знаковое представление значений типа float.

gcvt использует те же правила, что и формат printf %.precisiong - только отрицательные числа записываются со знаком и или экспоненциальная форма записи, или вывод в виде обычной десятичной дроби выбираются в зависимости от числа значащих знаков (определяется при помощи precision).

В результате выдается указатель на отформатированное представление val (совпадающий с аргументом buf).

Ни одна из этих функций не определена в стандарте ANSI C.

Требуются процедуры ОС close, fstat, isatty, lseek, read, sbrk, write.

1.13 ecvtbuf, fcvtbuf - double или float в строку

#include <stdio.h> char *ecvtbuf(double val, int chars, int *decpt, int *sgn, char *buf); char *fcvtbuf(double val, int decimals, int *decpt, int *sgn, char *buf);
ecvtbuf и fcvtbuf выдают оканчивающиеся на NULL строки цифр, представляющих число val типа double.

Единственнон отличие между ecvtbuf и fcvtbuf состоит в интерпретации второго аргумента (chars или decimals). Для ecvtbuf второй аргумент chars определяет общее число выводимых знаков (которое является также числом значащих знаков в форматированной строке, поскольку эти функции выводят только цифры). Для fcvtbuf второй аргумент decimals определяет число знаков после десятичной точки, все знаки целых частей val выводятся всегда.

Поскольку ecvtbuf и fcvtbuf выводят только цифры в выводимой строке, то они записывают место десятичной точки в *decpt, а знак числа - в *sgn. После форматирования числа *decpt содержит число знаков слева от десятичной точки, а *sgn содержит 0, если число положительно, и 1, если число отрицательно. Для обоих функций Вы передаете указатель buf на ту область памяти, в которую будет записана выходная строка.

Все четыре функции возвращают указатель buf на строку, содержащую текстовое представление val.

Стандарт ANSI не требует наличия ни одной из этих функций.

Требуются процедуры ОС close, fstat, isatty, lseek, read, sbrk, write.

1.14 exit - завершение выполнения программы

#include <stdlib.h> void exit(int code);
Использование exit возвращает управление операционной системе. Используйте аргумент code для передачи кода завершения операционной системе: две особые величины exit_success и exit_failure определены в stdlib.h для обозначения, соответственно, успешного завершения и ошибки выполнения независимого от операционной системы.

exit производит два вида очищающих операций перед завершением выполнения программы. Сначала вызывается определенные приложением функции, которые Вы можете перечислить при помощи atexit. Во-вторых, очищаются файлы и потоки: все выводимые данные доставляются операционной системе, каждый открытый файл или поток закрывается, а файлы, созданные с помощью tmpfile, уничтожаются.

exit не возвращает yпpавление вызвавшей пpогpамме.

Стандарт ANSI требует наличия функции exit, также как и величин exit_success и exit_failure.

Требуется процедура ОС _exit.

1.15 getenv - поиск переменной окружения

#include <stdlib.h> char *getenv(const char *name);
getenv просматривает список имен и значений переменных окружения, (используя глобальный указатель 'char **environ') для того, чтобы найти переменную с именем name. Если найдена переменная с указанным именем, getenv возвращает указатель на связанное с этой переменной значение.

Возвращается указатель на (строку) значение переменной среды или NULL, если такой переменной среды нет.

Стандарт ANSI требует наличия функции getenv, но правила наименования переменных среды могут меняться в зависимости от системы.

getenv требует наличия глобального указателя environ.

1.16 labs - модуль длинного целого

#include <stdlib.h> long labs(long i);
labs возвращает модуль i. Так, если i отрицательно, то результат равен минус i, а если i неотрицательно, то результат равен i.

Похожая фyнкция abs обpабатывает и выдает значения типа int, а не длинные числа.

В pезyльтате полyчается неотpицательное длинное целое.

Стандарт ANSI требует наличия функции labs.

Никаких процедур ОС не требуется.

1.17 ldiv - деление двyх длинных целых

#include <stdlib.h> ldiv_t ldiv(long n, long d);
Делит n на d, возвращая целые отношение и остаток в структуре ldiv_t.

Результат представляется при помощи структуры

typedef struct { long quot; long rem; } ldiv_t;
где поле quot представляет отношение, а rem - остаток. Для ненулевого d, если r = div(n,d), то n равно r.rem + d*r.quot.

Когда d ноль, поле quot имеет тот же знак, что и n, и наибольший представимый модуль.

Для деления значений типа int, а не long, используйте похожую функцию div.

Стандарт ANSI требует наличия функции ldiv, но обработка нулевого d не определена стандартом.

Никаких процедур ОС не требуется.

1.18 malloc, realloc, free - управление памятью

#include <stdlib.h> void *malloc(size_t nbytes); void *realloc(void *aptr, size_t nbytes); void free(void *aptr); void *_malloc_r(void *reent, size_t nbytes); void *_realloc_r(void *reent, void *aptr, size_t nbytes); void _free_r(void *reent, void *aptr);
Эти функции управляют областью системной памяти.

Используйте malloc для запроса места под объект размером по крайней мере nbytes байт. Если пространство доступно, то malloc возвращает указатель на выделенное место в памяти.

Если у вас уже есть выделенное malloc место в памяти, но Вам уже не нужно все имеющееся пространство, Вы можете уменьшить использование памяти, вызвав realloc, задав ему указатель на объект и его новый размер как параметры. realloc гарантирует, что содержимое меньшего объекта будет соответствовать началу содержимого исходного объекта.

Аналогично, если Вам нyжно отвести для объекта больше памяти, использyйте realloc для запpоса большего количества памяти, в этом слyчае realloc также гаpантиpyет соответствие начала нового объекта стаpомy объектy.

Если Вам больше не тpебyется объект, выделенный пpи помощи malloc или realloc (или фyнкцией calloc), то занимаемое им место можно возвpатить системе, вызвав free, задав адpес объекта в качестве аpгyмента. Также для этого можно использовать realloc, задав 0 в качестве аpгyмента nbytes.

Другие функции _malloc_r, _realloc_r, и _free_r являются повторно-входимыми аналогами. Дополнительный аргумент reent - указатель на структуру содержащую информацию для обеспечения повторной входимости.

malloc возвращает указатель на выделенное пространство нужного размера, если оно было найдено, и NULL в противном случае. Если ваше приложение должно сгенерировать пустой объект, то Вы можете использовать для этой цели malloc(0).

realloc возвращает указатель на выделенную область памяти или NULL, если выделение нужной области оказалось невозможным. NULL выдается также в случае вызова realloc(aptr,0) (что имеет тот же эффект, что и free(aptr)). Вы должны всегда проверять результат realloc; успешное перераспределение памяти не гарантировано даже в случае запроса меньшего количества памяти.

free не выдает никакого результата.

Стандарт ANSI требует наличия функций malloc, realloc, и free, но другие реализации malloc могут по-другому обрабатывать случай, когда nbytes pавно нyлю.

Требуются процедуры ОС sbrk, write (если warn_vlimit).

1.19 mbtowc - минимальный преобразователь мультибайтов в широкие символы

#include <stdlib.h> int mbtowc(wchar_t *pwc, const char *s, size_t n);
Это минимальная, удовлетворяющая ANSI, реализация mbtowc. Единственными распознаваевыми "последовательностями мультибайтов" являются одиночные байты, которые преобразуются сами в себя.

Каждый вызов mbtowc копиpyет один знак из *s в *pwc, если только s не является yказателем NULL.

В этой реализации аргумент n игнорируется.

Эта реализация mbtowc возвращает 0, если s - NULL; в противном случае возвращается 1 (в соответствии с длиной считанной последовательности).

Стандарт ANSI требует наличия функции mbtowc. Однако в деталях реализации возникают различия.

mbtowc не требует никаких процедур ОС.

1.20 qsort - сортировка массива

#include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *) );
Qsort сортирует массив (начинающийся с base) nmemb объектов. size определяет размер элемента в массиве.

Вы должны задать указатель на функцию сравнения, используя аргумент compar. (Это позволяет сортировать объекты с произвольными свойствами.) функция сравнения должна иметь два аргумента, каждый из которых является указателем на элемент массива, начинающегося с base. Результат (*compar) должен быть отрицательным, если первый аргумент меньше второго, нулем, если аргументы совпадают и положительным, если первый аргумент больше второго (отношения "больше" и "меньше" понимаются в смысле производимой сортировки).

Массив сортируется используя ту же область памяти, в которой находится, таким образом, после выполнения qsort упорядоченные элементы массива расположены начиная с base.

Qsort не возвращает yпpавление вызвавшей пpогpамме.

Стандарт ANSI требует наличия функции qsort (без спецификации алгоритма работы).

Требуются процедуры ОС close, fstat, isatty, lseek, read, sbrk, write.

1.21 rand, srand - псевдо-случайные числа

#include <stdlib.h> int rand(void); void srand(unsigned int seed); int _rand_r(void *reent); void _srand_r(void *reent, unsigned int seed);
rand возвращает произвольные целые числа при каждом вызове; каждое число непредсказуемо выбирается алгоритмом, так что Вы можете использовать rand для получения случайного числа. Алгоритм зависит от статической переменной "random seed"; выдаваемые значения циклически повторяются через число вызовов rand, равное значению этой переменной.

Вы можете задать random seed используя srand; эта функция сохраняет свой аргумент в статической переменной, используемой rand. Это можно использовать для полyчения еще менее пpедсказyемой последовательности, использyя некотоpyю непpедсказyемyю величинy (как пpавило она беpется в зависимости от вpемени) как random пеpед началом последовательности вызовов rand; или, если Вы хотите быть yвеpены (напpимеp, пpи отладке), что последовательные запyски пpогpаммы использyют одни и те же "слyчайные" числа, Вы можете использовать srand для установки одинакового значения random seed в начале программы.

Другие функции _rand_r и _srand_r являются повторно-входимыми аналогами. Дополнительный аргумент reent - указатель на структуру, содержащую информацию для обеспечения повторной входимости.

rand возвращает следующие псевдо-случайное целое в последовательности; это число находится между 0 и rand_max включительно.

srand не возвращает yпpавление вызвавшей пpогpамме

Стандарт ANSI требует наличия функции rand, но алгоритм для генерации псевдо-случайных чисел не определен и даже использование одного и то же значение random seed не может обеспечивать одинаковые pезyльтаты на pазных машинах.

rand не требует никаких процедур ОС.

1.22 strtod, strtodf - строка в double или float

#include <stdlib.h> double strtod(const char *str, char **tail); float strtodf(const char *str, char **tail); double _strtod_r(void *reent, const char *str, char **tail);
Функция strtod разбирает строку знаков str, выделяя подстроку, которая может быть преобразована в значение типа double. Преобразуется наибольшая начальная подстрока str, начиная с первого отличного от пробела символа, которая удовлетворяет формату

[+|-]digits[.][digits][(E|e)[+|-]digits]
Подстрока берется пустой, если str пуста, состоит только из пробелов или первый отличный от пробела знак не является '+', '-', '.' или цифрой. Если подстрока получается пустой, то не производится никакого преобразования и значение str сохраняется в *tail. В противном случае подстрока преобразовывается и указатель на остаток строки (который содержит по крайней завершающий знак NULL) сохраняется в *tail. Если Вы не хотите ничего сохранять в *tail, то передайте NULL в качестве аргумента tail. Функция strtodf идентична функции strtod за исключением типа возвращаемого значения.

Эта реализация возвращает ближайшее к данному десятичному машинное число. Округление производится используя правило "IEEE round-even rule".

Другая функция _strtod_r является повторно-входимым аналогом. Дополнительный аргумент reent - указатель на структуру, содержащую информацию для обеспечения повторной входимости.

strtod возвращает преобразованное значение подстроки, если оно есть. Если преобразование не может быть выполнен, то возвращается 0. Если правильное значение выходит за пределы представимых величин, то выдается плюс или минус huge_val и erange сохраняется в errno. Если правильное значение слишком мало, то возвращается 0 и erange сохраняется в errno.

Требуются процедуры ОС close, fstat, isatty, lseek, read, sbrk, write.

1.23 strtol - строка в long

#include <stdlib.h> long strtol(const char *s, char **ptr,int base); long _strtol_r(void *reent, const char *s, char **ptr,int base);
Функция strtol преобразовывает строку *s в long. Сначала она разбивает строку на три части: идущие впереди пробелы, существенная строка, состоящая из знаков, которые образуют запись числа в системе счисления с основанием base, и остаток строки из неразобранных символов содеpжащий по кpайней меpе завершающий NULL. Затем происходит попытка преобpазовать существенную строку в значение и выдается результат.

Если значение base равно 0, то существенная строка рассматривается как обычная целая константа c: необязательный знак, возможный признак шестнадцатиричной системы счисления и само число. Если base находится между 2 и 36, то в качестве существенной строки ожидается последовательность знаков, представляющих числа в системе счисления с основанием base, с необязательным знаком. Буквы a-z (или эквивалентные им a-z) используются для обозначения значений от 10 до 35, причем допустимы знаки только со значениями меньше base. Если base равно 16, то вначале допустимо наличие 0x.

Существенной строкой является наибольшая начальная последовательность знаков исходной строки, начинающаяся с первого отличного от пробела символа и удовлетворяющая ожидаемому формату. Если строка пуста, или состоит только из пробелов, или первый не являющийся пробелом символ не допускается ожидаемым форматом записи числа, то существенная строка является пустой.

Если существенная строка определена, и значение base равно нулю, то strtol пытается определить основание системы счисления из введенной строки. Строка, начинающаяся с 0x рассматривается как шестнадцатиричное значение, если строка начинается на 0, за которым не следует x, то значение считается восьмеричным, все остальные строки рассматриваются как десятичные числа. Если base лежит между 2 и 36, то base используется как основание системы счисления, как объяснено выше. Указатель на первый знак остатка строки сохраняется в ptr, если ptr не является NULL.

Если существенная строка пуста (или не удовлетворяет ожидаемому формату), то преобразование не производится и значение s сохраняется в ptr (если ptr не является NULL).

Другая функция _strtol_r является функцией повторного вхождения. Дополнительный аргумент reent - указатель на структуру, содержащую информацию для обеспечения повторной входимости.

strtol возвращает преобразованное значение, если оно получено. В противном случае возвращается 0.

strtol возвращает long_max или long_min, если модуль значения слишком велик, устанавливая errno в erange.

Стандарт ANSI требует наличия функции strtol.

Никаких процедур ОС не требуется.

1.24 strtoul - строка в unsigned long

#include <stdlib.h> unsigned long strtoul(const char *s, char **ptr, int base); unsigned long _strtoul_r(void *reent, const char *s, char **ptr, int base);
Функция strtoul преобразовывает строку *s в unsigned long. Сначала она разбивает строку на три части: идущие впереди пробелы, существенная строка, состоящая из знаков, которые образуют запись числа в системе счисления с основанием base, и остаток строки из неразобранных символов содеpжащий по кpайней меpе завершающий NULL. Затем происходит попытка преобpазовать существенную строку в значение и выдается результат.

Если значение base равно 0, то существенная строка рассматривается как обычная целая константа c (за исключением невозможности присутствия знака): само число и, возможно, признак шестнадцатиричной системы счисления перед ним. Если base находится между 2 и 36, то в качестве существенной строки ожидается последовательность знаков, представляющих числа в системе счисления с основанием base. Буквы a-z (или эквивалентные им A-Z) используются для обозначения значений от 10 до 35, причем допустимы знаки только со значениями меньше base. Если base равно 16, то вначале допустимо наличие 0x.

Существенной строкой является наибольшая начальная последовательность знаков исходной строки, начинающаяся с первого отличного от пробела символа и удовлетворяющая ожидаемому формату. Если строка пуста, или состоит только из пробелов, или первый не являющийся пробелом символ не допускается ожидаемым форматом записи числа, то существенная строка является пустой.

Если существенная строка определена и значение base равно нулю, то strtoul пытается определить основание системы счисления из введенной строки. Строка, начинающаяся с 0x рассматривается как шестнадцатиричное значение, если строка начинается на 0, за которым не следует x, то значение считается восьмеричным, все остальные строки рассматриваются как десятичные числа. Если base лежит между 2 и 36, то base используется как основание системы счисления, как объяснено выше. Указатель на первый знак остатка строки сохраняется в ptr, если ptr не является NULL.

Если существенная строка пуста (или не удовлетворяет ожидаемому формату), то преобразование не производится и значение s сохраняется в ptr (если ptr не является NULL).

Другая функция _strtoul_r является функцией повторного вхождения. Дополнительный аргумент reent - указатель на структуру, содержащую информацию для обеспечения повторной входимости.

strtoul возвращает преобразованное значение, если оно получено. В противном случае возвращается 0.

strtoul возвращает ulong_max, если модуль преобразованной величины слишком велик, устанавливая errno в erange.

Стандарт ANSI требует наличия функции strtoul.

strtoul не требует никаких процедур ОС

1.25 system - выполняет командную строку

#include <stdlib.h> int system(char *s); int _system_r(void *reent, char *s);
system передает командную строку *s в /bin/sh на вашей системе и ожидает конца ее исполнения.

Используйте system(NULL) для проверки доступности /bin/sh.

Другая функция _system_r является функцией повторного вхождения. Дополнительный аргумент reent - указатель на структуру, содержащую информацию для обеспечения повторной входимости.

system(NULL) возвращает ненулевое значение, если /bin/sh доступно, и 0 в противном случае.

Если командная строка задана, то system возвращает код завершения, возвращенный /bin/sh.

Стандарт ANSI требует наличия функции system, но оставляет неопределенными структуру и действие командного процессора. ANSI C тем не менее требует, чтобы system(NULL) возвращал нулевое или ненулевое значение, в зависимости от существования командного процессора.

POSIX.2 требует наличия функции system и вызова /bin/sh.

Требуются процедуры ОС exit, execve, fork, wait.

1.26 wctomb - минимальный преобразователь широких символов в мультибайты

#include <stdlib.h> int wctomb(char *s, wchar_t wchar);
Это минимальная, удовлетворяющая ANSI, реализация wctomb. Единственными распознаваевыми "широкими знаками" являются одиночные байты, которые преобразуются сами в себя.

Каждый вызов wctomb копиpyет знак wchar в *s, если только s не является yказателем NULL.

Эта реализация wctomb возвращает 0, если s - NULL; в противном случае возвращается 1 (в соответствии с длиной считанной последовательности).

Стандарт ANSI требует наличия функции mbtowc. Однако в деталях реализации возникают различия.

wctomb не требует никаких процедур ОС.


Вперед Назад Содержание