转义字符
- 1. 前言
- 2. 预备知识
- 2.1 打印格式
- 2.2 进制转换
- 2.3 ASCII码
- 3. 什么是转义字符
- 4. 常见的转义字符
- 4.1 `\?`
- 4.2 `\'`
- 4.3 `\"`
- 4.4 `\\`
- 4.5 `\ddd`ddd表示1到3个八进制数字
- 4.6 `\xdd`dd表示1到2个十六进制数字
- 4.7 其他转义字符
- 5. 一道笔试题
- 6. 一个小插曲
1. 前言
大家好,我是努力学习游泳的鱼。在字符中,有一类特殊的群体,你经常见到,但它们和你见到的样子可能不一样。它们就是转义字符。阅读这篇文章,你将对它们有更好的了解。
2. 预备知识
2.1 打印格式
我们可以用printf
配合%d
来打印整型,除此之外还有其他格式。
%d
- 打印整型
%s
- 打印字符串
%c
- 打印字符
#include <stdio.h>int main()
{printf("%d\n", 100);printf("%s\n", "abcdef");printf("%c\n", 'a');return 0;
}
2.2 进制转换
为什么十进制的130
表示的是130
呢?因为1
,3
,0
每个数字都有它的权重。其中从右往左,0
的权重是100,即1
,3
的权重是101,即10
,1
的权重是102,即100
,计算0×1+3×10+1×100
得到130
。
那么八进制的130
转换成十进制是多少呢?同理,从右往左,0
的权重是80,即1
,3
的权重是81,即8
,1
的权重是82,即64
,计算0×1+3×8+1×64=0+24+64=88
,即八进制的130
转换成十进制是88
。
十六进制数字的转换同理。
2.3 ASCII码
键盘上能敲出来的每个字符都对应一个ASCII码值,比如a
是97
,A
是65
等等。
3. 什么是转义字符
转义,即转变了原来的意思。
如果我这么写printf("abcndef");
那么屏幕上就会打印出abcndef
如果我在n
前面加个\
,即printf("abc\ndef");
那么屏幕上就会打印abc
,然后换行,接下来打印def
,此时这个\n
的作用就是换行。
n
本来的意思就是个字符'n'
,但加了个\
变成\n
之后就转变了原来的意思,变成了换行,所以\n
是一个转义字符。
4. 常见的转义字符
4.1 \?
在书写连续多个问号时使用,防止他们被解析成三字母词
早期的C语言编译器,存在三字母词。比如说,??)
表示]
,??(
表示[
。
所以如果我写printf("(Are you ok??)");
实际打印出来的效果就是(Are you ok]
。
所以正确的写法是printf("(Are you ok\?\?)");
此时的\?
就不是一个三字母词里的问号了,而是一个普普通通的问号。
4.2 \'
用于表示字符常量
'
如果我们想要打印一个单引号,我们不能写printf("%c", ''');
因为前两个单引号会组成一对单引号,第三个单引号就落单了。正确的写法是printf("%c", '\'');
此时的\'
就不是一对单引号里的单引号了,而是一个普普通通的单引号。
4.3 \"
用于表示一个字符串内部的双引号
明白\'
的作用后,\"
就很简单了。我们不能写printf("%s", """);
而应该写printf("%s", "\"");
因为前者的前两个双引号构成一对,第三个双引号就落单了,所以要对双引号进行转义,使其成为一个普普通通的双引号。
4.4 \\
用于表示一个反斜杠,防止它被解释为一个转义序列符。
如果我们想要打印一串路径,我们不能这么写printf("C:\test\test.c");
因为\t
会被识别为转义字符。正确的写法是printf("C:\\test\\test.c");
此时\\
的作用是让\不再是转义字符\t
里的\
,而是一个普普通通的\
。
写路径时,建议在每个反斜杠前都加个反斜杠。
4.5 \ddd
ddd表示1到3个八进制数字
比如\130
代表的是把130
这个八进制数字转换成十进制后得到的88
作为ASCII码值代表的字符,即'X'
。
4.6 \xdd
dd表示1到2个十六进制数字
比如\x31
代表的是把31
这个十六进制数字转换成十进制后得到的49
作为ASCII码值代表的字符,即'1'
。
4.7 其他转义字符
\a
警告字符,蜂鸣
\b
退格符
\f
进纸符
\0
字符串结束标志
\n
换行
\r
回车
\t
水平制表符
\v
垂直制表符
5. 一道笔试题
下面的程序输出的结果是什么呢?
#include <stdio.h>
#include <string.h>int main()
{printf("%d\n", strlen("c:\test\628\test.c"));return 0;
}
关键是认出\t
是一个转义字符,还有……
\628
?
nonono!反斜杠后面跟1到3个八进制数字,八进制数字只有0到7,哪有8呀?所以\62
是一个转义字符,不带后面的8玩!
输出的结果是14。
6. 一个小插曲
我在测试\a
时,写了一段代码
#include <stdio.h>int main()
{while (1){printf("\a");}return 0;
}
结果电脑直接卡住了,结束进程都没用哈哈哈,不得不重启了。
所以:
大家没事不要写这种危险的代码……
不信的话你可以试试。