Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

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

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

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

Добавлен: 13.12.2020

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

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

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

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

  определяет  

максимальное  количество  байт,  которые  рассматривает  функ- 
ция. 


background image

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


background image

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

 широких символов, или 

при  встрече  широкого  символа,  для  которого  нет  соответствую-
щего длинного символа. 


background image

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

 


background image

  

 
 

Г Л А В А  

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

, то исполнение программы продолжается. 

  

 


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