朋友们,大家好!今天我们又见面啦!
上一篇内容我给大家分享了我对字符串及其知识点的一些理解,还做了一些测试。今天我将给大家分享的是我对转义字符相关知识点的一些个人理解。
转义字符——字面意思就是转变含义的字符,这里我的理解就是一个字符被转变成了其他的含义,就好比蔬菜面条,原本是蔬菜的,结果把它打成汁后和面粉和在一起就变成了面条。那问题来了,这个字符是被什么东西给改变含义的呢?我们接着往下看。
还记得上一篇有提到的‘\0’吗?(有兴趣的朋友可以翻阅一下计算机萌新的成长历程——初识C语言7)里面结尾有这么一句话
(注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束的标志,不算作字符串内容。)
这里就有说\0是一个转义字符,那它是把什么东西给转义了呢?这里我们可以打印字符来寻求答案。
看到系统提示的错误有点头大呀。不过没关系,我们按照系统提示的错误来一一分析一下。
首先看第8行提示的错误有:缺少右引导、常量中有换行符、从int到char截断。
这里就有点意思了,这里我查找了从int到char截断这个问题的解决方案,我发现别人有提到一个问题,有些字符看起来是一个字符,其实他是字符串,无法赋值给char
然后我们再来看第9行的错误提示:应输入“;”、在标识符printf前缺少“;”
我们再来看第8的代码,不知道大家有没有注意到这里\'它发生了点变化,第7行正常的单引号是红色,这里它却变成了紫色,这里会不会是它出问题了呢?我们接着在它后面再加一个单引号看看
代码正常运行,这里0是正常打印,但是"\"打印的却不是我们需要的"\",而是原先作为表示字符字面量的单引号给打印出来了,这里的单引号变成了字符,所以我们不妨大胆推测一下,这里是不是因为"\"将单引号的原先的作用给改变了,由表示字符字面量的符号转变成了一个字符呢?这里我们做个测设,看看能不能通过加上一个"\"来将"\"转变为字符,如下图所示:
这里我们可以看到,确实如我们猜想的一样,这里我们可以得出结论"\0"之所以是一个转义字符就是因为"\"将"0"原本的性质转变成了一个字符串的结束标志,“\”在其中的作用就是作为转义工具,这里我们就把“\”称为转义字符的转义序列符。那下面问题来了,究竟有哪些转义字符呢?这里鹏哥给我们列举出了一系列的转义字符,如下图所示:
这些转义字符大家可以记忆一下,以后可能会经常用到。这里我解释一下几个字符的意思:
“\?”——在老版本的VS中有一个符号叫三字母词,比如“??+)”计算机在遇到这三个字符时会将他们解析成一个字符,导致将这三个字符分别打印出来,这里我们想将其一一打印的话就需要添加转义序列符,也就是像这样“\?\?)”这样就能正常打印了;
“\ddd”——这里的意思是一个转义符加1-3个数字时表示的是1-3个八进制数字(0~7),这里我们下面会重点介绍一下;
“\xdd”——这里的意思是一个转义符加一个x再加2个数字表示的是2个十六进制(0~9与A~F)的数字。
下面我们通过一组代码来解释“\ddd”与“\xdd”,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("%c\n", '\123');//将'\123'以字符的形式打印出来;
printf("%d\n", '\123');//将'\123'以整数(十进制)的形式打印出来;
printf("%c\n", '\x45');//将'\x45'以字符的形式打印出来;
printf("%d\n", '\x45');//将'\x45'以整数(十进制)的形式打印出来;
return 0;
}
打印结果如下图所示:
在说明这个结果之前,首先我们先要知道八进制和十六进制如何转化为十进制,转化过程如下:
\123——八进制123转化为十进制=1×8^2+2×8^1+3×8^0=64+16+3=83;(八进制的数值范围是0~7)
\x45——十六进制45转化为十进制=4×16^1+5×16^0=64+5=69;(十六进制的数值范围是数字0~9+字母A~F(a~f))
现在大家应该就能理解为什么数值打印出来是83和18了吧,不过问题是为什么打印字符时出现的是“S”、正方形而不是‘\123’与‘\x12’?要解释这个问题前,我们要先介绍一下ASCII码值这个知识点。
什么是ASCII码值?
这里简单的理解ASCII码值就是一套标准,一套将数字、字母、字符(符号)用2进制数值表示的标准。
(注:这里的字符代表的是各种各样的符号如:“♠♥♦♣”这样的符号,在C语言中字符是数字、字母以及符号的统称,这里为了防止大家混淆,下面我将统称的字符字体颜色标红)
下面我们来看一下ASCII码表:
看到这张图可能就有朋友有疑问了,不是说ASCII码值是来将数字、字母、字符(符号)用2进制数值表示的标准吗?为什么这里是10进制的数值呢?对于这个问题,我的个人理解是,计算机是不能识别这里数字、字母、字符(符号)的,它能识别的内容只有2进制,但是这些数字、字母、字符(符号)都不是二进制呀,所以为了表示这些字符,咱们的前辈们就给这些数字、字母、字符(符号)用10进制的数为它们编上了自己的编号,这个就是ASCII码值,这个编号并不是无穷大的,他有一个具体的范围(0~127),计算机在读取它们的时候会将它们的10进制的编号给转化成2进制以此来识别它们每一个字符(统称)。因此我们可以在这张表上看到每一个字符所对应的编号。
这里我们再返回来看一下刚刚打印的结果S——83、E——69,下面我们在上面的表上找到83和69这两个编号如下图所示:
图上是不是刚好69对应的是E,83对应的是S呀。
看到这里大家应该能理解这个打印结果以及ASCII码值了吧。这里我想问下大家还记不记得在介绍字符串时我们有对字符串里的内容进行过监视这个操作,如下图所示:
大家可以看一下在字符‘a’、'b'、'c'、'\0'的左边都紧跟着一个数分别是97/98/99/0,这时我们先对照ASCII码值寻找一下这些字符以及它自己的编号,如下图:
看到这里大家就知道在监视时出现在字符左边的数字是什么意思了吧,没错这些数字就是他对应的在ASCII码表中的编号。
下面我们来探讨一下这些转义字符它代表的是一个字符还是一串字符,这里我们借用strlen函数来计算,代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>//这里在使用string相关的函数如:strlen、strcpy、strcat...等函数时需要引用此头文件。
int main()
{
printf("%d\n", strlen("\0"));
printf("%d\n", strlen("\'"));
printf("%d\n", strlen("\""));
printf("%d\n", strlen("\\"));
printf("%d\n", strlen("\a"));
printf("%d\n", strlen("\123"));
printf("%d\n", strlen("\x45"));
return 0;
}
运行结果如下:
这里我们可以看到除了字符串的停止符以外,其他的字符的字符长度都只有一个字符的长度。
下面我们对今天的内容做个总结:
1.转义字符的意思是一些字符通过添加转义序列符“\”使其含义发生了变化,如字符“n”,本身的含义就是一个字符,但是在添加转义序列符后“\n”,它则变成了换行标志;
(注:并不是所有的字符都能被转义)
2.ASCII码值是一套通过将数字、字母、符号用十进制数值(0~127)进行编号,然后计算机将其转变成二进制数值来将其表示的标准;
3.八进制和十六进制转化成十进制的方式就是Σd*n(i-1),d为对应位数的数值,n为对应进制,i为对应位数,如八进制的123转化为十进制就是1*8^(3-1)+2*8^(2-1)+3*8^(1-1)=64+16+3=83;
(注:八进制的数值范围是数字0~7,十六进制的数值范围是数字0~9+字母A~F(a~f))
4.转义字符的字符长度是1。
转义字符的相关知识点我就全部分享完了,如果这篇文章能够帮助大家理解转义字符的话,那它就完成了它的使命,后面随着学习的深入,我会继续分享自己在学习过程中的感受,感谢大家的翻阅,为了帮助大家进一步加深各位对转义字符的理解我提出两个问题,欢迎大家在下面评论一下答案:
1.请问下面这个文件夹的字符串的长度是多少?
c:\Program Files\VS\test\x32\228\test.c
2.如何编写代码能将这个文件夹的字符串以字符的形式打印出来?
这两个问题的答案我会在下篇内容里公示出来,咱们下一篇见。