C - isgraph()函数

Rub*_*uck 5 c

有谁知道这个isgraph()功能在C中是如何工作的?我理解它的用法和结果,但它背后的代码是我感兴趣的.

例如,它只查看它的char值并将其与ASCII表进行比较吗?或者它是否实际检查是否可以显示?如果是这样,怎么样?

Jon*_*ler 6

isgraph()函数背后的代码因平台而异(或者更确切地说,通过实现).一种常见的技术是使用初始化的位域数组,在(单字节)代码集中每个字符加一个EOF(必须由函数接受),然后选择相关位.这允许作为安全的宏(仅评估其参数一次)和作为简单(可能是内联)函数的简单实现.

#define isgraph(x) (__charmap[(x)+1]&__PRINT)
Run Code Online (Sandbox Code Playgroud)

where __charmap__PRINT是为实现保留的名称.该+1部分与普通情况下交易EOF-1.


根据C标准(ISO/IEC 9899:1999):

§7.4.1.6isgraph函数

概要

#include <ctype.h>
int isgraph(int c);
Run Code Online (Sandbox Code Playgroud)

描述

isgraph函数测试除空格('')之外的任何打印字符.

和:

§7.4字符处理 <ctype.h>

1标题声明了几个对字符分类和映射有用的函数.166)在所有情况下,参数都是一个int,其值应表示为unsigned char或者等于宏EOF的值.如果参数具有任何其他值,则行为未定义.

2这些函数的行为受当前语言环境的影响.下面将说明仅在不在"C"语言环境中时具有语言环境特定方面的那些函数.

3术语打印字符是指特定于语言环境的字符集的成员,每个字符占据显示设备上的一个打印位置; 术语控制字符是指不是打印字符的特定于语言环境的字符集的成员.167)所有字母和数字都是打印字符.

166)参见"未来图书馆方向"(7.26.2).

167)在使用7位US ASCII字符集的实现中,打印字符是其值从0x20(空格)到0x7E(代字号)的字符; 控制字符是其值从0(NUL)到0x1F(US)的字符,以及字符0x7F(DEL).