转义字符
- 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 \dddddd表示1到3个八进制数字
 
比如\130代表的是把130这个八进制数字转换成十进制后得到的88作为ASCII码值代表的字符,即'X'。
4.6 \xdddd表示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;
}
结果电脑直接卡住了,结束进程都没用哈哈哈,不得不重启了。
 所以:
大家没事不要写这种危险的代码……
不信的话你可以试试。