c语言stdio.h库函数部分解析

本文介绍了ASCII码的基础知识,包括字符分类和编码方式。通过定义一个包含ASCII字符类型的数组,实现了对字符是否为字母、数字或ASCII码的判断。示例函数展示了如何利用这个数组进行查表操作,以确定字符的属性。
摘要由CSDN通过智能技术生成

本文只针对对字母数字等判断部分。

ASCII码

首先需要了解基础知识ASCII码,如下:
在这里插入图片描述
在这里插入图片描述
以真实的值代表设定的含义,这是一种编码方式。只针对编码前0~128部分

字符分类

大概分成几种类型:

  • 字母(大小字母)
  • 数字
  • 控制字符
  • 可打印字符
  • 空白字符
    那么我们可将0到128定义成一个数组形式的表,用来查表代表字符是哪种类型。
#define _CTYPE_NUM_CHARS 128
const uint8_t   _C_ctype_[1 + _CTYPE_NUM_CHARS] = {
    0,
    _C,    _C,    _C,    _C,    _C,    _C,    _C,    _C,
    _C,    _C|_S, _C|_S, _C|_S, _C|_S, _C|_S, _C,    _C,
    _C,    _C,    _C,    _C,    _C,    _C,    _C,    _C,
    _C,    _C,    _C,    _C,    _C,    _C,    _C,    _C,
    _S|_B, _P,    _P,    _P,    _P,    _P,    _P,    _P,
    _P,    _P,    _P,    _P,    _P,    _P,    _P,    _P,
    _N,    _N,    _N,    _N,    _N,    _N,    _N,    _N,
    _N,    _N,    _P,    _P,    _P,    _P,    _P,    _P,
    _P,    _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U,
    _U,    _U,    _U,    _U,    _U,    _U,    _U,    _U,
    _U,    _U,    _U,    _U,    _U,    _U,    _U,    _U,
    _U,    _U,    _U,    _P,    _P,    _P,    _P,    _P,
    _P,    _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L,
    _L,    _L,    _L,    _L,    _L,    _L,    _L,    _L,
    _L,    _L,    _L,    _L,    _L,    _L,    _L,    _L,
    _L,    _L,    _L,    _P,    _P,    _P,    _P,    _C
};
const unsigned char *_ctype_ = _C_ctype_;

第一个是0,使用时候偏移量+1即可,这里不影响。0到127为128个数,再加开始的0,为 1 + _CTYPE_NUM_CHARS
上面分组类型分为字母数字用标志位形式定义,填入数组中,比如数组里面与ASCII对应,数组角标填入可直接输出字符的类型,是字母还是数字。
在这里插入图片描述
分类的字母数字等,又可以通过位形式包含
在这里插入图片描述
例如将二进制111(十进制7)设定为英文字母大写标志,那可打印标志设置为1,标志&成立,则这个字符是可以进行打印。

举例实现

下面进行举例实现库函数,希望大家可以举一反三。
判断字符是否是字母或者数字

int isalnum(int c)
{
    /*- 输入值非-1时查表法与数字和字母对比结果返回  */
    return (c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)c] & (_U | _L | _N)));
}

ctype +1是将开始0偏移掉,将字符填入数组以角标方式直接获取到该字符的类型,不为0时是成立。
判断字符是否是ASCII码

int lib_isascii(int c)
{
    return ((c >= 0x00 && c <= 0x7f) ? 1 : 0);/* 在0~127之间为ASCII码 */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值