ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4306
Скачиваний: 28
Глава 21. Стандартные функции <stdlib.h>
301
21.8. Обработка длинных символов
Длинным
(multibyte) называется символ, для хранения которого
может потребоваться более одного байта. Такие символы исполь-
зуются в кодовых таблицах для некоторых восточных алфавитов.
Максимальное количество байт, которые могут использоваться
для хранения одного символа алфавита, задается макросом
MB_CUR_MAX
. Значение этого макроса зависит от локальной катего-
рии, которая определяется значением макроса
LC_CTYPE
, опреде-
ленного в заголовочном файле locale.h.
Кодировка длинных символов может быть
зависимой от состоя-
ния
(state dependent encoding). Это значит, что длинные символы в
данной кодировке могут занимать различное количество байт.
Для определения количества байт, которые используются для
хранения длинного символа, предназначена функция
mblen
, кото-
рая имеет следующий прототип:
int mblen(const char *str, size_t n);
Если значение параметра
str
не равно
NULL
, то функция возвра-
щает длину первого длинного символа, который хранится в стро-
ке
str
. Причем рассматриваются только первые
n
байтов строки
str
. Если строка
str
не содержит такого символа, то функция
mblen
возвращает значение
-1
.
Если значение параметра
str
равно
NULL
, то функция
mblen
воз-
вращает ненулевое значение, если кодировка длинных символов
зависит от состояния. В противном случае функция возвращает
нулевое значение.
Для преобразования длинного (multibyte) символа в
широкий
(wide) символ предназначена функция
mbtowc
, которая имеет сле-
дующий прототип:
int mbtowc(wchar_t *pwc, const char *str, size_t n);
Параметр
str
указывает на исходную строку с длинным симво-
лом, параметр
pwc
— на строку, в которую функция поместит
соответствующий широкий символ, а параметр
n
определяет
максимальное количество байт, которые рассматривает функ-
ция.
Часть III. Стандартная библиотека языка программирования C
302
Если значение параметра
str
не равно
NULL
, то функция
mbtowc
возвращает длину преобразованного символа или значение
-1
,
в случае если параметр
str
не указывает на длинный символ.
Если значение параметра
str
равно
NULL
, то функция
mbtowc
воз-
вращает ненулевое значение, если кодировка длинных символов
зависит от состояния. В противном случае функция возвращает
нулевое значение.
Для обратного преобразования из широкого символа в длинный
символ предназначена функция
wctomb
, которая имеет следующий
прототип:
int wctomb(char *str, wchar_t wchar);
Параметр
wchar
задает широкий символ, а параметр
str
указывает
на строку, в которую будет записан соответствующий длинный
символ.
Если значение параметра
str
не равно
NULL
, то функция
wctomb
возвращает количество байтов, в которые записан длинный сим-
вол или значение
-1
, в случае если для широкого символа, задан-
ного параметром
wchar
, не существует соответствующего длин-
ного символа.
Если значение параметра
str
равно
NULL
, то функция
wctomb
воз-
вращает ненулевое значение, если кодировка длинных символов
зависит от состояния. В противном случае функция возвращает
нулевое значение.
В листинге 21.14 приведен пример использования функций
mblen
,
mbtowc
и
wctomb
.
Листинг 21.14. Преобразования между длинными
и широкими символами
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main()
{
wchar_t a = L'a';
Глава 21. Стандартные функции <stdlib.h>
303
wchar_t w;
char str[10];
printf("%d\n", wctomb(str, a)); /* печатает 1 */
printf("%d\n", mblen(str, 10)); /* печатает 1 */
printf("%d\n", mbtowc(&w, str, 10)); /* печатает 1 */
wprintf(L"wide symbol: %c\n", w); /* печатает a */
return 0;
}
Для преобразования строки длинных символов в строку широких
символов предназначена функция
mbstowcs
, которая имеет сле-
дующий прототип:
size_t mbstowcs(wchar_t *pwcs, const char *str, size_t n);
Параметр
str
указывает на исходную строку длинных символов,
а параметр
pwcs
— на строку, в которую функция поместит соот-
ветствующую строку широких символов. Преобразование пре-
кращается при достижении конца строки, который задается пус-
тым символом, или после обработки
n
длинных символов, или
при встрече последовательности символов, которые не образуют
длинный символ.
Функция
mbstowcs
возвращает количество преобразованных
длинных символов без завершающего пустого символа или зна-
чение
-1
, если обработка была прервана при встрече "недлинно-
го" символа.
Для обратного преобразования строки широких символов в стро-
ку длинных символов предназначена функция
wcstombs
, которая
имеет следующий прототип:
size_t wcstombs(char *str, const wchar_t *pwcs, size_t n);
Параметр
pwcs
должен указывать на исходную строку широких
символов, а параметр
str
на строку, в которую функция поместит
соответствующую строку длинных символов. Преобразование
прекращается при достижении конца строки, который задается
пустым символом, или после обработки
n
широких символов, или
при встрече широкого символа, для которого нет соответствую-
щего длинного символа.
Часть III. Стандартная библиотека языка программирования C
304
Функция
wcstombs
возвращает количество преобразованных ши-
роких символов без завершающего пустого символа или значе-
ние
-1
, если обработка была прервана при встрече широкого сим-
вола, для которого не нашлось соответствия.
В листинге 21.15 приведен пример использования функций
mbstowcs
и
wcstombs
.
Листинг 21.15. Преобразование строки длинных символов
в строку широких символов и наоборот
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main()
{
wchar_t a[] = L"abc";
wchar_t w[4];
char str[10];
printf("%d\n", wcstombs(str, a, 4)); /* печатает 3 */
printf("%d\n", mbstowcs(w, str, 10)); /* печатает 3 */
wprintf(L"wide string: %s\n", w); /* печатает: abc */
return 0;
}
Г Л А В А
22
Диагностика ошибок
<assert.h>
Для записи отладочной информации в стандартный поток вывода
stderr
предназначен макроc
assert
, который определен в заголо-
вочном файле assert.h. Определение этого макроса имеет сле-
дующий вид:
#undef assert
#if defined NDEBUG
#define assert(тест) (void)0
#else
#define assert(тест) void_выражение
#endif
Здесь
тест
— это целочисленное выражение, а
void_выражение
—
это выражение на языке программирования С, которое собствен-
но и определяет реализацию макрокоманды
assert
. Работает мак-
рос
assert
следующим образом. Если значение выражения
тест
равно
0
, то в стандартный поток
stderr
выводится сообщение,
которое содержит следующую информацию:
текст выражения
тест
;
имя исходного файла (предопределенная макрокоманда
__FILE__
);
номер строки (предопределенная макрокоманда
__LINE__
).
После этого макрокоманда завершает программу посредством
вызова стандартной функции
abort
. Если значение выражения
тест
не равно
0
, то исполнение программы продолжается.