目录
1.转义字符的简义
顾名思义,转义字符是一种与原字符意义不相同的一种字符类型。
举个简单的例子:字母n是一个只是一个普通的字符,在字符串打印时自然会原封不动地被打印出来。但如果在n前面加上一个反斜杠 \ 组成字符 \n的话,那么字符串在打印的过程中都不会把 n 或 \n 打印出来,而是会在原本是n的地方实现换行功能。
下面用代码来解释:(左边是代码,右边是终端的结果)
字符n:
转义字符 \n:
2.转义字符的种类
转义字符有上百个,因为该篇文章是面向初学者的,我将选取最具代表性的11个转义字符,并详细讲解他们的用法以及它们的用途举例。
2.1 九个典型的转义字符
2.1.1 可打印类转义字符(1~4)
1. \' 用法:⽤于表⽰字符常量 ' 。
用途场景:当我们想把符号 ' 打印出来的时候,如果只是像下面这样处理的话会报错
错误的原因在于,系统不会认为中间的单引号 ' 是字符,在编译器中单引号 ' 和双引号 " 必须成对出现,否则就会报错。此时有3个 ' ,只能构成一对单引号,剩下一个 ' 不能配对,造成了编写错误“缺少右引号”。
那我们应该如何把 ' 打印出来呢?方法很简单,只需要用转义字符 \' 就能实现。如下
2. \" 用法:⽤于表⽰⼀个字符串内部的字符常量 " 。
用途场景:当我们想把符号 ' 打印出来的时候,如果只是像下面这样处理的话会报错
错误原因其实是和上面的单引号是一样的,我就不重复了,直接给出正确示范。
3. \? 作用:⽤于表⽰字符常量 ? ,在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在 新的编译器上已经没法验证了。
用途场景:这里给大家解释一下解析成三字母词是什么情况
假如我们要打印这句话“(are you ok??)”
如果这样写: printf("(are you ok??)");
在旧编译器中,??) 会组成三字母词从而变成 ] ,则结果为:(are you ok]。
所以要写成:printf("(are you ok\?\?)");
在新编译器中不会出现这样的错误。
4. \\ :⽤于表⽰⼀个反斜杠 \ ,防⽌它被解释为⼀个转义序列符。
用途场景:假如我们要打印一个文件路径:c:\number1\test
结果为:
错误的原因是 n、t 与 \ 结合成了转义字符 \n 、\t。
正确的做法是,使用转义字符 \\ :
2.1.2 功能类转义字符(5~9)
5. \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
在vs2020中,写出 printf("\a"); 后,按下f5键(或ctrl+f5)弹出终端时,会发出声音。
(有趣的小东西)
6. \b :退格键,光标回退⼀个字符,但不删除字符。
很多同学刚学到 \b 的时候,经常会以为它的作用是删除前一个字符,其实它真正的作 用是使光标回退一个字符。
如果 \b 后面还有字符,那么该字符会在回退后的光标处打印,并把 \b 前一个字符覆盖上,从而实现 “删除前一个字符” 的效果。(比如在 \b 后面加上空格)
代码演示:此时光标停在了 d 的前面
当 \b 后面还有字符,则会把 d 覆盖掉,实现删除 d 的效果
注意:光标后面的字符 会被 \b 后面的字符 一 一对应地替换掉,如果没有则保留。
代码演示:
此时光标在d处
在后面加上h i 的话,原本的cd 会被hi 覆盖;这4个字符没有被完全覆盖,所以还有字符被保留下来
为什么f被空格覆盖了? 因为这是一串字符串,而每个字符串后面都隐藏了一个转义字符\0,
字符\0把 f 覆盖了;但又因为 \0是无法打印出来的,所以是一个空格。
7. \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个8的倍数(有的可能是4的倍数,这是编 译器决定的)。
8. \n :换⾏符。
【开头有演示,这里不再赘述】
9. \r :回⻋符,光标移到同⼀⾏的开头。
这里直接代码演示:光标来到了a这个位置,即该行的行头位置
与 \n 不同:如果我们把\r改成\n后,光标去到了下一行的位置
与 \b 相似:如果我们在 \r 后面加上其他字符,那么字符串会在行头处开始被覆盖
2.2 两个关于数字的转义字符
2.2.1 作用(10~11)
10. \ddd :d d d表⽰1~3个⼋进制的数字。
如:\130表⽰字符X :
注意:\ddd 最多是3位八进制数,因为ASCII码只有256个,如果八进制数ddd超过十进制数 255将会没有意义。而对于最小的4位八进制数1000是 8^3 = 512(大于255),所以不能 写成\dddd。
11. \xdd :d d表⽰2个⼗六进制数字。
如:\x40表⽰字符@ :
注意:\xdd 最多是2位十六进制数,因为ASCII码只有256个,如果十六进制数xdd超过十进 制数255将会没有意义。而对于最小的3位十六进制数x100是 16^2 = 256(大于255), 所以不能写成\xddd。
2.2.2 字符 \0
字符\0 就是 转义字符\ddd类型 中的一种,它表示的是空字符或终止符,无法被打印出来。
'\0' == 0 ,字符\0的ASCII码值 等于 数值0。
而 '0' == 48 ,所以字符\0与字符0是不一样的。
3.转义字符的长度
3.1 strlen与转义字符长度
strlen的补充说明:
strlen()函数是用来计算字符串长度的函数,它的特点是从字符串中的第一个字符开始数,数到 \0 前一个字符结束。
这里给出结论:除了字符 \0 的长度是0,其他的转义字符长度都是1。
这里用上述11个转义字符举例:
结果:
关于数字的转义字符长度也是1:
结果:
值得注意的是,\0 与 \x0 是同一个东西,因为他们的十进制数都是0。
3.2 易错字符串长度的例子分析
学了这么多,出道蓝题考考你们,你们觉得 strlen("c:\test\abc\178\test.c") 有多长?
……
……
……
答案是17。 其中里面的转义字符有:\t \a \17 \t
为什么数字转义字符是\17而不是\178?(易错点)
因为此时是八进制转义字符,八进制中出现的数字不能大于等于8
你学会了吗?(^_^)(^_^)(^_^)