5. C语言 -- 字符和字符串

本博客主要内容为 “小甲鱼” 视频课程《带你学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 的默认修饰符。因此,使用 signedunsigned 修饰符,是由编译系统自行决定。

  如下面的代码所示

#include <stdio.h>

int main()
{
	char height;
	height = 170;
	printf("身高是%d厘米!\n", height);
	return 0;
}

将得到如下的输出结果

身高是-86厘米!

这里的原因就是字符型的 signedunsigned 修饰符是由编译系统自行决定,在 Ubuntu16.04 中使用 gcc 进行编译执行的时候默认字符型是有符号的。因为 170 的二进制表达为 10101010,但是此时的二进制表达对应着是一个负数(首位的符号位为 1),这时 printf 输出的补码 10101010 所对应的数字,我们保持符号位不变,首先将 0101010 - 1 ,得 0101001,然后再按位取反得 10101101010110对应的十进制数字为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

欢迎大家关注我的知乎号(左侧)和经常投稿的微信公众号(右侧)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值