Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

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

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

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

Добавлен: 13.12.2020

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

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

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

Часть III. Стандартная библиотека языка программирования C 

336 

29.8. Функции для работы с памятью 

Для  работы  с  блоками  памяти  используются  функции 

memchr

memcmp

memcpy

memmove

 и 

memset

Функция 

memchr

 имеет следующий прототип: 

  void* memchr(const void *str, int c, size_t n); 

Эта  функция  ищет  первое  вхождение  символа,  заданного  пара-
метром 

c

, в 

n

 байтах массива 

str

. При поиске параметр 

c

 приво-

дится к типу 

unsigned char

. В случае успеха функция возвращает 

адрес первого найденного символа, а в случае неудачи — 

NULL

Функция 

memcmp

 имеет следующий прототип: 

  int memcmp(const void *str1, const void *str2, size_t n); 

Эта функция сравнивает 

n

 байтов массивов 

str1

 и 

str2

. Функция 

возвращает отрицательное, нулевое или положительное значение, 
если первые 

n

 байтов массива 

str1

 соответственно меньше, равны 

или  больше  первых 

n

  байтов  массива 

str2

.  При  сравнении  эле-

менты массивов приводятся к типу 

unsigned char

Функция 

memcpy

 имеет следующий прототип: 

  void* memcpy(const void *dst, const void *src, size_t n); 

Эта функция копирует первые 

n

  байтов  из  массива 

src

  в  массив 

dst

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

непредсказуем. Функция возвращает адрес массива 

dst

Функция 

memmove

 имеет следующий прототип: 

  void* memmove(const void *dst, const void *src, size_t n); 

Эта функция копирует первые 

n

  байтов  из  массива 

src

  в  массив 

dst

,  обеспечивая  корректную  обработку  перекрывающихся  мас-

сивов. Функция возвращает адрес массива 

dst

Функция 

memset

 имеет следующий прототип: 

  void* memset(const void *str, int c, size_t n); 

Эта  функция  копирует  символ,  заданный  параметром 

c

,  в  пер- 

вые 

n

  байтов  массива  строки 

str

.  При  копировании  параметр 

c

 


background image

Глава 29. Функции для работы со строками <string.h> 

337 

приводится  к  типу 

unsigned  char

.  Функция  возвращает  адрес 

массива 

str

В  листинге  29.10  приведены  примеры  использования  функций 
для работы с памятью. 

Листинг 29.10. Примеры использования функций для работы  
с памятью 

#include <stdio.h> 
#include <string.h> 
 
int main() 

  char str[] = "Char 1"; 
  char stq[] = "Char 2"; 
  char move[] = "char1 char2"; 
 
  /* печатает: r 1 */ 
  printf("%s\n", memchr(str, 'r', sizeof(str))); 
  /* печатает: -1 */ 
  printf("%d\n", memcmp(str, stq, sizeof(str))); 
  /* печатает: Char 1 */ 
  printf("%s\n", memcpy(stq, str, sizeof(stq))); 
  /* печатает: char2 char2 */ 
  printf("%s\n", memmove(move, move + 6, 5)); 
  /* печатает: xxxxx char2 */ 
  printf("%s\n", memset(move, 'x', 5)); 
 
  return 0; 

29.9. Сравнение строк,  

содержащих локальные символы 

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

strcoll

  и 

strxfrm

.  Под  локальными  символами 

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


background image

Часть III. Стандартная библиотека языка программирования C 

338 

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

strcoll

, которая имеет следующий прототип: 

  int strcoll(const char *str1, const char *str2); 

Эта функция лексикографически сравнивает строки 

str1

 и 

str2

 и 

возвращает отрицательное, нулевое или положительное значение, 
если строка 

str1

 соответственно меньше, равна или больше стро-

ки 

str2

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

strcoll

.  При  сравнении  эта  функция  учи-

тывает  значение  символической  константы 

LC_COLLATE

,  которая 

определена в заголовочном файле locale.h. 
В листинге 29.11 приведен пример сравнения строк, содержащих 
локальные символы, при помощи функции 

strcoll

Листинг 29.11. Сравнение строк, содержащих локальные символы 

#include <stdio.h> 
#include <string.h> 

 

int main() 

  char str1[] = "ээ юю"; 
  char str2[] = "ээ ээ"; 
 
  printf("%d\n", strcoll(str1, str1));  /* печатает: 0 */ 
  printf("%d\n", strcoll(str1, str2));  /* печатает: 1 */ 
 
  return 0; 

Функция 

strxfrm

 имеет следующий прототип: 

  size_t strxfrm(char *str1, const char *str2, size_t n); 


background image

Глава 29. Функции для работы со строками <string.h> 

339 

Эта функция преобразует 

n

 символов из строки 

str2

, содержащей 

локальные символы к виду, в котором эти символы могут участ-
вовать в сравнении строк, используя функцию 

strcmp

. Преобразо-

ванная  строка  записывается  в  строку 

str1

.  Результат  сравнения 

преобразованных строк, используя функцию 

strcmp

, такой же, как 

и  результат  сравнения  не  преобразованных  строк  при  помощи 
функции 

strcoll

.  При  преобразовании  символов  эта  функция 

учитывает  значение  символической  константы 

LC_COLLATE

,  кото-

рая определена в заголовочном файле locale.h. 
В листинге 29.12 приведен пример преобразования строк, содер-
жащих локальные символы, при помощи функции 

strxfrm

Листинг 29.12. Преобразование строк, содержащих локальные 
символы 

#include <stdio.h> 
#include <string.h> 
 
int main() 

  char str1[] = "ээ юю"; 
  char s1[10]; 
 
  strxfrm(s1, str1, sizeof(str1)); 
  printf("%d\n", strcmp(s1, s1));  /* печатает: 0 */ 
 
  return 0; 

29.10. Получение строки, 

описывающей код ошибки 

Для  получения  строки,  описывающей  код  ошибки,  используется 
функция 

strerror

, которая имеет следующий прототип: 

  char* strerror(int errcode); 

Эта  функция  возвращает  адрес  строки,  которая  описывает  код 
ошибки,  заданный  параметром 

errcode

.  На  практике  этот  пара-


background image

Часть III. Стандартная библиотека языка программирования C 

340 

метр  обычно  представляется  значением  символической  констан-
ты 

errno

, которая описана в заголовочном файле errno.h. 

В  листинге  29.13  приведен  пример  получения  строки,  описы-
вающей код ошибки, при помощи функции 

strerror

Листинг 29.13. Получение строки, описывающей код ошибки 

#include <stdio.h> 
#include <string.h> 
#include <math.h> 
 
extern int errno; 
 
int main() 

  double y = fmod(1,0);  /* остаток от деления 1 на 0 */ 
  printf("%s\n", strerror(errno));  /* печать: Domain error */ 
 
  return 0; 

 


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