C - функция isgraph () - PullRequest
       1

C - функция isgraph ()

4 голосов
/ 01 марта 2011

Кто-нибудь знает, как работает функция isgraph() в C? Я понимаю его использование и результаты, но интересующий его код - это то, что меня интересует.

Например, он смотрит только на значение char и сравнивает его с таблицей ASCII? Или он действительно проверяет, может ли он отображаться? Если да, то как?

Ответы [ 4 ]

6 голосов
/ 01 марта 2011

Код функции isgraph() зависит от платформы (или, точнее, от реализации). Одним из распространенных методов является использование инициализированного массива битовых полей, по одному на символ в (однобайтовом) кодовом наборе плюс EOF (который должен быть принят функциями), а затем выбор соответствующего бита. Это допускает простую реализацию в виде макроса, который является безопасным (оценивает его аргумент только один раз) и как простую (возможно встроенную) функцию.

#define isgraph(x) (__charmap[(x)+1]&__PRINT)

, где __charmap и __PRINT - имена, зарезервированные для реализации. Часть +1 имеет дело с общей ситуацией, когда EOF равно -1.


Согласно стандарту C (ISO / IEC 9899: 1999):

§7.4.1.6 Функция isgraph

Синопсис

#include <ctype.h>
int isgraph(int c);

Описание

Функция isgraph проверяет любой печатный символ, кроме пробела ('').

И

§7.4 Обработка символов <ctype.h>

¶1 Заголовок объявляет несколько функций, полезных для классификации и отображения символы. 166) Во всех случаях аргумент представляет собой int, значение которого должно быть может быть представлен как беззнаковый символ или должен равняться значению макроса EOF. Если Аргумент имеет любое другое значение, поведение не определено.

¶2 Поведение этих функций зависит от текущей локали. Те функции, которые имеют специфичные для локали аспекты, только если они не в локали "C", отмечены ниже.

¶3 Термин «печатный символ» относится к элементу набора символов для каждой локали, каждый из которых занимает одну позицию печати на устройстве отображения; термин контрольный характер относится к элементу набора символов для конкретной локали, которые не печатаются символы. 167) Все буквы и цифры являются печатными символами.

166) См. «Будущие направления библиотеки» (7.26.2).

167) В реализации, в которой используется семибитный набор символов ASCII США, используются следующие символы печати: чьи значения лежат от 0x20 (пробел) до 0x7E (тильда); контрольные символы - это те, чьи значения лежат в диапазоне от 0 (NUL) до 0x1F (US) и символа 0x7F (DEL).

2 голосов
/ 01 марта 2011

Он называется isgraph, а не isGraph (и char, а не Char), а в Руководстве программиста POSIX сказано:

Функция isgraph () должна проверять, является ли символ c графа классов в программе.текущая локаль;см. том Базовых определений IEEE Std 1003.1-2001, Глава 7, Язык.

Так что да, он ищет его в таблице (или эквивалентном коде).Он не может проверить, действительно ли он может отображаться, поскольку это будет зависеть от устройства вывода, многие из которых могут отображать символы в дополнение к тем, для которых isgraph возвращает true.

0 голосов
/ 18 сентября 2013

Макрос isgraph () просматривает только таблицу ASCII или версию таблицы ASCII вашего местоположения / страны / провидения / планеты / галактики.

Вот тестовый код Подсчет слов , который показал, что вы можете повысить производительность, написав свою собственную версию, которая инициализирует массив bool [256] с помощью isgraph (). Есть результаты теста с кодом.

Поскольку переменные / массивы bool на самом деле являются байтами, а не битами, с точки зрения эффективности памяти вы можете добиться еще лучших результатов, если будете использовать битовый массив и протестировать его. К счастью, занимает всего 32 байта. Это почти наверняка обналичит любой современный процессор общего назначения.

Важно, что если вы хотите немного отличаться от стандартных тестов, представленных здесь (см. Графическое изображение тестов символов) , вы можете изменить инициализацию, предоставляемую стандартным тестом, для включения собственных исключений. ,

Truth table for various character test macros

0 голосов
/ 01 марта 2011

isgraph проверяет наличие «печатаемых» символов, но определение «печатаемых» может варьироваться в зависимости от вашей локали.Ваша локаль может использовать символы, которых нет в таблице ASCII.Внутренне это, скорее всего, поиск таблицы, тест на основе диапазона ((x >= 'a') && (x <= 'z') и т. Д.) Или их комбинация.Различные реализации могут делать это немного по-разному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...