栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++字符函数库 cctype 和位运算转换字母

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++字符函数库 cctype 和位运算转换字母

C++字符函数库 cctype 和位运算转换字母
  • cctype简述
  • cctype库内函数
  • 位运算对字母的转换

cctype简述

C++从C语言中继承了一个与字符相关的函数库(cctype),它可以确定字符是否为大写或小字母、数字、标点符号等工作,这些函数包含在以下头文件中

#include
cctype库内函数

我们先定义一个字符 char c;

  • isalnum(c); 如果括号内参数是字母或数字,函数就返回true,否则返回false。

  • isalpha(c); 如果参数是字母,函数返回true, 否则返回false。

  • islower(c); 如果参数是小写字母,函数返回true,通常我们也可以这样判断小写字母 c >= 'a' && c <= 'z'

  • isupper(c); 如果参数是大写字母,函数返回true,通常我们也可以这样判断大写字母 c >= 'A' && c <= 'Z'

  • isdigit(c); 如果参数是数字,函数返回true,通常我们也可以这样判断数字 c >= '0' && c <= '9'

  • isxdigit(c); 如果参数是十六进制数字,即0 ~ 9,a ~ f或A ~ F,函数返回true。

  • ispunct(c); 如果参数是标点符号,函数返回true.

  • iscntrl(c); 如果参数是控制字符,函数返回true。
    什么是控制字符? 控制字符也叫不可见字符,即ASCII码中不能正确打印显示出来的字符。

  • isgraph(c); 如果参数除空格之外的打印字符,函数返回true。
    什么是打印字符?打印字符也叫可见字符,即ASCII码中可以正确打印显示出来的字符,注意。

  • isprint(c); 如果参数是打印字符(包括空格' '),函数返回true。

  • isspace(c); 如果参数是标准空白字符,如空格' '、换行符'n'、水平制表符't'等

接下来两个转换字母大小写的函数比较常用

  • tolower(c); 如果参数是字母(无论大小写),函数返回其小写字母,否则返回原字符。
  • toupper(c); 如果参数是字母(无论大小写),函数返回其大写字母,否则返回原字符。
位运算对字母的转换

先定义一个字符 char c; 以下讨论默认 c 为字母

我们知道小写字母的ASCII值比其大写字母的大32,因此我们通常采取下面两种方式转换字母大小写

  • c = c + 32; 把大写字母转换为小写
  • c = c - 32; 把小写字母转换为大写

我们要把 c 转换为大写字母,如果一开始我们不知道 c 为大写还是小写,要对其转换的话,我们通常需要一个 if 语句判断一下 c 的大小写 如:if(c>='a'&&c<='z') 或者if(islower(c)) ,然后才对其转换,一般需要两步。有没有更加高效的算法一步到位呢?当然是有的,而且还真和位有关,位运算!

我们先来看一眼具体操作:

  • c = c | 32; 利用或运算将这个字母转化为小写字母
  • c = c & ~32; 利用与运算将这个字母转化为大写字母
  • c = c ^ 32; 利用异或运算将字母大小写互换,即大写转小写,小写转大写

这样做的原理是什么呢?我们先来看一下字母的ASCII码值

大写十进制二进制小写十进制二进制
A650100 0001a970110 0001
B660100 0010b980110 0010
C670100 0011c990110 0011
Z900101 1010z1220111 1010

通过观察我们发现,大写字母和其小写的二进制位只有在第6位(加粗部分)才出现不同,其他位都相同

因此,我们只需要改变二进制的第6位,其余位保持不变,就能实现字母大小写的转换,如何改变呢?当然得在那个不同的第6位二进制上面下功夫,利用8位二进制数0010 0000进行操作,它的十进制是32。

一个字母转换为对应小写字母,把这个字母的ASCII值和32按位进行或运算

以A和a为例:

  • A(0100 0001) | 32(0010 0000) = a(0110 0001)
  • a(0110 0001) | 32(0010 0000) = a(0110 0001)

一个字母转换为对应大写字母,把这个字母的ASCII值和 ~32 按位进行与运算,~32就是对32按位取反,32(0010 0000) ——> ~32(1101 1111)

以B和b为例:

  • b(0110 0010) & ~32(1101 1111) = B(0100 0010)
  • B(0100 0010) & ~32(1101 1111) = B(0100 0010)

字母大小写互换,大写转小写,小写转大写,把这个字母的ASCII值和32按位进行异或运算

以Z和z为例:

  • Z(0101 1010) ^ 32(0010 0000) = z(0111 1010)
  • z(0111 1010) ^ 32(0010 0000) = Z(0101 1010)

看了这些推导过程,你一定理解了上面的操作了,你也可以编写程序验证一下结果的正确性,以加深印象。如果你还有疑惑的地方,请在下方评论里发问。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/510630.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号