ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4290
Скачиваний: 28
Часть 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
Глава 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
. Под локальными символами
подразумеваются символы, входящие в кодовую таблицу, ис-
пользуемую на компьютере. Эти символы могут принадлежать
Часть 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);
Глава 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
. На практике этот пара-
Часть 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;
}