Хрестоматия по программированию на Си в Unix


Мобильность и машинная зависимость программ. Проблемы с русскими буквами. - стр. 6


Выигрыш в скорости получается вот почему: если мы определим

#define isalpha(c) (((c) >= 'a' && (c) <= 'z') \ ((c) >= 'A' && (c) <= 'Z'))

то этот оператор состоит из 7 операций. Если же мы используем isalpha из <ctype.h>

(как определено выше) - мы используем только две операции: индексацию и проверку битовой маски &. Операции _ctype+1 и _U|_L вычисляются до констант еще при компиляции, и поэтому не вызывают генерации машинных команд.

Определенные выше toupper и tolower работают верно лишь в кодировке ASCII, в которой все латинские буквы расположены подряд и по алфавиту. Обратите внимание, что tolower имеет смысл применять только к большим буквам, а toupper - только к маленьким:

if( isupper(c) ) c = tolower(c);

Существует еще черезвычайно полезный макрос isspace(c), который можно было бы определить как

#define isspace(c) (c==' ' c=='\t'c=='\f' \ c=='\n'c=='\r') или

#define isspace(c) (strchr(" \t\f\n\r",(c)) != NULL)

На самом деле он, конечно, реализован через флаги в _ctype[]. Он используется для определения символов-пробелов, служащих заполнителями промежутков между словами

текста.

Есть еще два нередко используемых макроса: isprint(c), проверяющий, является ли c ПЕЧАТНЫМ символом, т.е. имеющим изображение на экране; и iscntrl(c), означающий, что символ c является управляющим, т.е. при его выводе на терминал ничего не изобразится, но терминал произведет некоторое действие, вроде очистки экрана или перемещения курсора в каком-то направлении. Они нужны, как правило, для отображения управляющих ("контроловских") символов в специальном печатном виде, вроде ^A для кода '\01'.

Задание: исследуйте кодировку и <ctype.h> на вашей машине. Напишите функцию лексикографического сравнения букв и строк.

Указание: пусть буквы имеют такие коды (это не соответствует реальности!):

буква: а б в г д е код: 1 4 2 5 3 0 нужно: 0 1 2 3 4 5

Тогда идея функции Ctou перекодировки к упорядоченному алфавиту такова:




- Начало -  - Назад -  - Вперед -



Книжный магазин