ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4307
Скачиваний: 28
Часть III. Стандартная библиотека языка программирования C
296
если первый символ — цифра от
1
до
9
, то предполагается, что
число представлено в десятичной системе счисления;
если первый символ — цифра
0
, а второй — цифра от
1
до
7
,
то предполагается, что число представлено в восьмеричной
системе счисления;
если первый символ — цифра
0
, а второй — символ
Х
или
х
, то
предполагается, что число представлено в шестнадцатеричной
системе счисления.
Если параметр
base
равен числу от
2
до
36
, то это значение при-
нимается за основание системы счисления и любой символ, вы-
ходящий за рамки этой системы, прекращает преобразование.
В системах счисления с основанием от
11
до
36
для обозначения
цифр используются символы от
A
до
Z
(или от
a
до
z
).
В листинге 21.11 приведен пример использования функции
strtol
.
Листинг 21.11. Преобразование строки в длинное целое число
#include <stdio.h>
#include <stdlib.h>
int main()
{
long int n;
char *p;
n = strtol("12a", &p, 0); /* n = 12, *p = a */
printf("n = %ld, stop = %c\n", n, *p);
n = strtol("012b", &p, 0); /* n = 10, *p = b */
printf("n = %ld, stop = %c\n", n, *p);
n = strtol("0x12z", &p, 0); /* n = 18, *p = z */
printf("n = %ld, stop = %c\n", n, *p);
n = strtol("01119", &p, 0); /* n = 73, *p = 9 */
printf("n = %ld, stop = %c\n", n, *p);
return 0;
}
Глава 21. Стандартные функции <stdlib.h>
297
Для преобразования строки в длинное целое число без знака ис-
пользуется функция
strtoul
. Эта функция имеет следующий про-
тотип:
unsigned long int strtoul(const char *str,
char **endptr, int base);
Параметры этой функции имеют то же назначение, что и анало-
гичные параметры функции
strtol
. В случае успешного завер-
шения функция
strtoul
возвращает число типа
unsigned long
,
в которое преобразуется строка, а в случае неудачи —
0
.
Для преобразования строки в число типа
double
используется
функция
strtod
, которая имеет следующий прототип:
double strtod(const char *str, char **endptr);
Параметры этой функции имеют то же назначение, что и анало-
гичные параметры функции
strtol
. В случае успешного завер-
шения функция
strtod
возвращает число типа
double
, в которое
преобразуется строка, а в случае неудачи —
0
.
Все функции, рассмотренные в этом разделе, прекращают свою
работу при встрече первого символа, который не подходит под
формат рассматриваемого числа.
Кроме того, в случае если символьное значение числа превосхо-
дит диапазон допустимых значений для соответствующего типа
данных, то функции
strtol
,
strtoul
,
strtod
устанавливают в пе-
ременной
errno
значение
ERANGE
. Переменная
errno
и макрос
ERANGE
определены в заголовочном файле math.h. При этом функ-
ция
strtod
возвращает значение
HUGE_VAL
, функция
strtol
воз-
вращает значение
LONG_MAX
или
LONG_MIN
, а функция
strtoul
—
значение
ULONG_MAX
. Макрос
HUGE_VAL
определен в заголовочном
файле math.h, а остальные макросы определены в заголовочном
файле limits.h.
Для преобразования числовых данных в символьные строки мо-
гут использоваться нестандартные функции
itoa
,
ltoa
,
utoa
,
ecvt
,
fcvt
и
gcvt
. Но лучше для этих целей использовать стандартную
функцию
sprintf
.
Часть III. Стандартная библиотека языка программирования C
298
21.6. Арифметические функции
Для получения абсолютной величины целого числа предназначе-
на функция
abs
, которая имеет следующий прототип:
int abs(int x);
Эта функция возвращает абсолютное значение целого числа
x
.
Например:
int n = abs(-10); /* n = 10 */
Для получения абсолютной величины длинного целого числа
предназначена функция
labs
, которая имеет следующий прото-
тип:
long labs(long x);
Эта функция возвращает абсолютное значение целого числа
x
.
Например:
long n = abs(-10); /* n = -10 */
Заметим, что если параметр
x
функций
abs
и
labs
содержит отри-
цательное целое число, максимальное для заданного диапазона,
то результат работы этих функций не определен.
Для вычисления частного и остатка от деления целых чисел ис-
пользуется функция
div
, которая имеет следующий прототип:
div_t div(int n, int d);
Здесь
n
обозначает делимое, а
d
— делитель. Функция возвращает
структуру типа
div_t
, которая определена следующим образом:
typedef struct _div_t
{
int quot; /* частное */
int rem; /* остаток */
} div_t;
Например:
div_t d = div(5, 2);
printf("%d %d\n", d.quot, d.rem); /* печатает 2 1 */
Глава 21. Стандартные функции <stdlib.h>
299
Для вычисления частного и остатка от деления длинных целых
чисел используется функция
ldiv
, которая имеет следующий
прототип:
ldiv_t ldiv(long n, long d);
Здесь
n
обозначает делимое, а
d
— делитель. Функция возвращает
структуру типа
ldiv_t
, которая определена следующим образом:
typedef struct _ldiv_t
{
long quot; /* частное */
long rem; /* остаток */
} ldiv_t;
Например:
ldiv_t d = ldiv(5, 2);
printf("%d %d\n", d.quot, d.rem); /* печатает 2 1 */
21.7. Генерация случайных чисел
Для генерации последовательности псевдослучайных чисел пред-
назначена функция
rand
, которая имеет следующий прототип:
int rand(void);
При каждом последующем вызове эта функция возвращает сле-
дующее псевдослучайное число. Псевдослучайные числа нахо-
дятся в интервале от
0
до
RAND_MAX
. По стандарту макрос
RAND_MAX
определяется как целое число, которое не меньше чем 32 767.
В листинге 21.12 приведен пример генерации пяти случайных
чисел.
Листинг 21.12. Генерация псевдослучайных чисел
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
Часть III. Стандартная библиотека языка программирования C
300
for (i = 0; i < 5; ++i)
printf("%d ", rand()); /* печать псевдослучайных чисел */
printf("\n");
return 0;
}
Если программу из листинга 21.12 запустить несколько раз под-
ряд, то можно увидеть, что каждый раз будет печататься одна и
та же последовательность псевдослучайных целых чисел.
Для изменения последовательности псевдослучайных чисел, ко-
торые генерирует функция
rand
, используется функция
srand
, ко-
торая имеет следующий прототип:
void srand(unsigned int seed);
Значение параметра
seed
используется для определения началь-
ной точки последовательности псевдослучайных чисел. Каждый
вызов функции
srand
вызывает установку начальной точки для
последовательности псевдослучайных чисел. Использование
функции
rand
без предварительного вызова функции
srand
экви-
валентно вызову функции
srand(1)
.
В листинге 21.13 приведен пример генерации последовательно-
сти случайных чисел, начальная точка которой задается числом
2
.
Листинг 21.13. Генерация псевдослучайных чисел с выбором
последовательности
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
srand(2);
for (i = 0; i < 5; ++i)
printf("%d ", rand());
printf("\n");
return 0;
}