本博客主要内容为 “小甲鱼” 视频课程《带你学C带你飞》【第一季】 学习笔记,文章的主题内容均来自该课程,在这里仅作学习交流。在文章中可能出现一些错误或者不准确的地方,如发现请积极指出,十分感谢。
也欢迎大家一起讨论交流,如果你觉得这篇文章对你有所帮助,记得评论、点赞哦 ~(。・∀・)ノ゙
1. 字符类型
回顾上篇博文《4. C语言 – 数据类型和取值范围》中的 “2.3 基本数据类型的取值范围” 部分,可以知道字符类型事实上是一个特殊的整型,因此它也有取值范围,signed char
的取值范围是 -128 ~ 127;unsigned char
的取值范围是 0 ~ 255。
1.1 ASCII 码
存放在字符类型中的变量,都可以被解释为 ASCII 字符表中的对应字符。标准 ASCII 字符表使用7位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中,ASCII 字符表上的数字 0 ~ 31 以及 127(共 33 个)分配给了控制字符,用于控制像打印机等一些外围设备。这些是看不到的。数字 32 ~ 126 分配给了能在键盘上找到的字符,这些是所见即所得的。
比如执行下面的代码
#include <stdio.h>
int main()
{
char a = 'C';
printf("%c = %d\n", a, a);
return 0;
}
将得到如下的输出结果C = 67
其中字符 a
以 “C” 的形式输出是没有问题的,后面的 67 实际输出的就是字符 a
的 ASCII 码。当然我们也可以给字符型的变量赋值一个正整数(ASCII 码),其同样可以以字符型的形式输出,如下
#include <stdio.h>
int main()
{
char a = 70, b = 105, c = 115, d = 104, e = 67;
printf("%c%c%c%c%c\n", a, b, c, d, e);
return 0;
}
将得到如下的输出结果FishC
1.2 字符型的符号位
但是字符类型与普通整数类型又存在着不同之处。C 标准规定普通整数类型默认使用 signed
修饰符,但没有规定 char
的默认修饰符。因此,使用 signed
或 unsigned
修饰符,是由编译系统自行决定。
如下面的代码所示
#include <stdio.h>
int main()
{
char height;
height = 170;
printf("身高是%d厘米!\n", height);
return 0;
}
将得到如下的输出结果
身高是-86厘米!
这里的原因就是字符型的 signed
或 unsigned
修饰符是由编译系统自行决定,在 Ubuntu16.04 中使用 gcc 进行编译执行的时候默认字符型是有符号的。因为 170 的二进制表达为 10101010
,但是此时的二进制表达对应着是一个负数(首位的符号位为 1),这时 printf
输出的补码 10101010
所对应的数字,我们保持符号位不变,首先将 0101010
- 1 ,得 0101001
,然后再按位取反得 1010110
,1010110
对应的十进制数字为86,所以11010110
对应的数字就是 -86。
解决这一类问题比较好的方法就是将代码中的 char height;
改为 unsigned char height;
,通过指定是否为有符号数来解决这个问题。
2. 字符串类型
字符串实际上是由一些字符组成的,比如说 “Hello World” 是由下面的字符组成的。
最后面的 '\0'
表示一个字符出的结束,因为在读入字符串的过程中,机器需要知道他从哪里读到哪里,这个时候就需要 '\0'
表示一个字符出的结束。
定义字符串有以下2种方式:
// 给出字串中字符的个数以及每个字符分别是什么
char a[6] = {'a','p','p','l','e','\0'};
// 直接使用字符串进行命名,不用指定字符串中字符的个数,不用在结尾加入 '\0',不用 {}
char b[] = "apple"
其中对于字符串的定义利用了一些数组的知识,这部分知识将在后面的博客中进行介绍。
2.1 举例说明
下面的程序使用了上面的两种方式分别创建了两个字符串
#include <stdio.h>
int main()
{
char a[6] = {'a','p','p','l','e','\0'};
char b[] = "apple";
printf("%s\n", a);
printf("%s\n", b);
printf("a[0] is %c and a[5] is%cspace\n", a[0], a[5]);
printf("b[0] is %c and b[5] is%cspace\n", b[0], b[5]);
return 0;
}
除此之外还打印输出了字符串中的位与首位和末尾的字符,实验结果如下图所示
通过上面的实验我们可以看出通过两种方式创建的字符串是一样的;虽然我们看见的字符串的 “长度” 是 5,但实际上字符串的长度是 6,末尾是 \0
并不会输出什么(如实验结果中 “is” 与 “space” 之间相连,所以 \0
什么都不会输出,当然也不会是空格之类的)。
参考
[1] “小甲鱼” 视频课程《带你学C带你飞》【第一季】P8
欢迎大家关注我的知乎号(左侧)和经常投稿的微信公众号(右侧)