当前课程知识点:基于Linux的C++ > 第六讲 复合数据类型 > 6.2 字符 > LinuxCPP0602
我们首先来看字符类型
在C++语言中定义一个字符类型的方式
是使用char关键字
看我们定义的方式char ch
定义了一个字符类型的变量ch
后来定义一个字符常量cch
并把它初始化成单一的字符‘C’
表示这个字符文字的时候
要使用单引号对
特别注意这个地方
实际存储的时候
这个字符类型的量
它事实上将会转换成一个整数来存储
它将存储的是这个字符所对应的
ASCII码值
我们可以使用signed、unsigned两个关键字
对char这个类型进行限制
正常情况下
我们不需要对它进行限制
因为如果对它进行限制的话
我们就应该使用unsigned
缺省的情况下它是signed
所有这样的量 包括字符量
如果你没有用unsigned对它进行限定
它缺省的时候是signed 是有符号的
这个字符存储一般有多大呢
正常情况下 使用8位
也就是一个字节来存储它
表达范围实际上是在-128~127之间
如果使用unsigned来限定它
正常情况下它的表达范围
其实就是0~225之间
注意 这是ASCII码
如果你是在现在的计算机下边
使用的是UNICODE字符集
正常情况下
UNICODE字符集是使用两个字节
而不是一个字节
也就是16位来表达这一个单一的字符
现在为了处理的方便
我们只考虑ASCII码
也就是说我们不考虑UNICODE的字符
当表示一个特定的字符量的时候
像这样的定义和初始化的方式
你注意
char a初始化为单引号大写的字符‘A’
第二条char a初始化为65
char a初始化成0101
char a初始化成0x41
这四个模式其实是一样的
因为这个大写的字符‘A’
它对应的ASCII码值其实就是65
八进制就是0101
然后16进制就是0x41
所以这四种表达的方式
其实是完全等价的
四种方式你用哪一个都可以
这个就是我们在计算机中常用的ASCII码
表格上面是从0到9
底下从0、10、20一直到120
你数的时候
对应的ASCII码值就是它的横和列之和
比如讲Space这个空格 就是30加2
对应ASCII码是32
按照这个方式去计算就OK了
在这个ASCII码表里边
一般来讲不需要记某个特定的字符
所对应的ASCII码值
你说要记住一些常用的当然是很好的
如果记不住 其实关系也不大
特别需要知道的就是
‘0’它事实上对应的ASCII码值
是48 而不是0
ASCII码值真正为0的那个字符
它是一个很特殊字符
我们看它写的是实际上是‘\0’
它不是真正的‘0’
这个地方说得其实不太精确
ASCII码值在我们计算机里怎么保存呢
它当然是按照一个整数来保存的
它要和这个整数构成一一映射
这个整数就是从0到127
这个ASCII码值‘\0’
在计算机内部保存的时候
保存的其实就是0
我们真正的数字‘0’
在计算机内部保存的时候
事实上保存的是ASCII码值48
记住这个地方就可以了
ASCII码表包括一系列的可见的字符
除此之外 还有一些控制字符
因为以前ASCII码表
是为通信所准备的
所以它里面还包括了一些
通信专用字符
有相当多的字符不用了
剩下的在计算机键盘上面
很多能够看到的 就叫可打印字符
有一些我们不可打印
我们只能使用一些特定的字符来表达
比如回车 实际上是不可打印的
那么我们怎么表达它呢
必须用转义字符序列来表达它
讲到回车和换行
这个地方需要特别地强调一下
因为我们现在写的程序
是Linux程序代码
很多同学操作系统用得最多的
可能是Windows或Mac
很少使用Linux操作系统
那么在这种情况下
同学们要特别记得
这个回车和换行符在Windows下面
在Linux下边 在Mac下边 是不一样的
在Windows下边
用一个双字符‘\n’、‘\r’来表达的
在Linux下边使用的是‘\n’
而在Mac下边是‘\r’
这三个操作系统所表达的回车和换行
字符格式是不一样的
所以你的文本文件
在跨操作系统平台传输的时候
如果你不处理回车和换行字符
那么这个文本换了一个操作系统
它的显示可能是不对的
这个地方可能是需要注意的
其它没什么
我们来看一个例子
怎么对这个字符量进行数学运算
我们编写一个函数
来判定某个特定的字符是不是数字
我们判定的不是它是0~9之间
我们判定的
当然应该是它在‘0’~‘9’之间
就按照这个方式去写
我写一个函数bool IsDigit
来判断一个字符c是不是一个数字
那么我们怎么判断呢
if(c>=’0’ && c<=’9’)
你注意 这第一个一定是要有单引号的
你不能写c>=0 && c <=9
这个方式就错了
那我们判断的是它的ASCII码值
在0~9之间
而不是在‘0’~‘9’之间
‘0’~‘9’之间真实的ASCII码值
或者说我们用数字
来对它进行判断的话
它在什么之间呢
它事实上是在48和57之间
判定它的时候
实际上应该写if(c>=48 && c<=57)
按照这个模式来写才对
如果我们判断是成立的
那么我们就return true 否则false
这个就是这个函数的实现
看上去很简单
就是一个if-else语句
我们再看第二个例子
我要编写一个函数
将一个特定的字符转换为
它所对应的那个大写字符
那么 这里边就有一个特别的要求
如果字符是一个英文小写字母
那我就把它转换成一个大写字母
如果它不是英文字母
或者就是一个小写的英文字母
那我就不管它 原样输出就完了
那我怎么判断这个字符
是个小写的英文字母呢
就是if(c>=’a’ &&c<=’z’) 我就return
return什么呢
return这个字符对应的那个大写英文字母
我们刚才看ASCII码表也知道
ABCDEFG、abcdefg不管大写还是小写
都是按照这个顺序排的
所以如果你知道大写字母‘A’
和小写字母‘a’之间差多远
那你就知道小写字母‘b’
和大写字母‘B’差多远
大写的字母在前边
小写的字母在后边
所以小写字母ASCII码值是大的
你记住这个就行了
那么我们怎么来去算呢
我就用c减去字符‘a’
那两者一减
其实就得到了这两个字符之间的差值
把大写字母‘A’加上去
我们按照这个方式来写可以了
这就是我们这个程序的实现
仍然是一个简单的If-else语句
但是同学们要注意的是
在这里边我使用一个数学的式子
来计算一个特定的字符c
所对应的那个大写字母应该是什么
我们实际上是把这样的字符
当成一个小整数来操作的
这种方式是完全合法的
在C++里边提供了一系列标准字符运算
当然实际上这是C的代码
C的函数库里边包括一系列字符特征
库函数它写在“ctype.h”这个头文件里
用C++模式包含这个头文件的时候
你就可以写“cctype”
它里边提供了一系列
标准字符的特征函数
标准字符的特征函数里边常用的有
Isalnum、isalpha、isdigit、islower、isupper等等
像isalnum就是判定这个字符c
是不是英文字母和数字
如果是 就返回true
否则就返回false
isdigit就是刚才我们实现的那个
就问这个字符c
它是不是一个数字
像isalpha 就问这个字符c
它是不是个英文字母
如果是 它就返回true
否则就会返回false
这个就是基本的实现
islower是不是小写
isupper是不是大写
tolower、toupper
转换成小写 转换成大写
这都是“cctype”这个头文件
给我们提供的标准字符的特征函数
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口