Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4307

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть 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; 


background image

Глава 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


background image

Часть 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 */ 


background image

Глава 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; 


background image

Часть 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; 


Смотрите также файлы