有谁知道这个isgraph()功能在C中是如何工作的?我理解它的用法和结果,但它背后的代码是我感兴趣的.
例如,它只查看它的char值并将其与ASCII表进行比较吗?或者它是否实际检查是否可以显示?如果是这样,怎么样?
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函数
概要
Run Code Online (Sandbox Code Playgroud)#include <ctype.h> int isgraph(int c);描述
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).