关于C语言中的转义字符

作者: ricksteves 分类: C语言 发布时间: 2018-04-08 21:08

所有的ASCII码都可以使用转义字符来表示,其中包括了常用的打印字符和一些具有特殊功能的非打印字符。
在C语言中,打印字符,如字母、数字、空格等字符,可以直接使用引号包含这些字符即可构成字符或字符串数据。
对于非打印字符,在引号中则必须使用转移字符来进行表示。

基本形式

首先转义字符和普通字符数据一样,只能够出现在单引号或者双引号中。并且转义字符都以\开头。
转义字符有三种表示方式,分别是
1. 8进制 \加8进制数字
2. 16进制 \x加16进制数字
3. 特殊转义字符 \加有特殊意义的符号

注意:转义字符不存在10进制的书写形式。

数字转义

数字转义字符只能使用8进制和16进制。
每个字符的转义数值分别对应了其ASCII码的值。
例如:

字符转义字符(8进制)转义字符(16进制)
‘a’‘\141’‘\x61’
‘+’‘\53’‘\x’
‘0’‘\60’‘\x30’

所有的ASCII字符都可以使用这种方式进行表示。
在C语言中,如果想用ASCII码值的10进制方式输入字符。可以使用10进制整数直接给字符变量赋值,例如char a=97;同样这种方式能够输入所有的ASCII字符,但是这种方式只能对单个字符变量进行赋值,并不能够对整个字符串进行一次性赋值。

符号转义

打印字符,可以使用字符本身和数字转义两种方式表示。
非打印字符,除了使用数字转义的方式表示外,也有另一种表示方式,特殊符号转义。
这种转义方式由反斜杠和一个打印字符组成,用来表示一个非打印字符,常用相关的字符如下。

转义字符意义ASCII码值(10进制)缩写来源
\a响铃(BEL)007Alert
\b退格(BS) ,将当前位置移到前一列008Backspace
\f换页(FF),将当前位置移到下页开头012form feed
\n换行(LF) ,将当前位置移到下一行开头010line feed
\r回车(CR) ,将当前位置移到本行开头013return
\t水平制表(HT) (跳到下一个TAB位置)009Tab
\v垂直制表(VT)011vertical tab

上面的字符中,需要特别注意三个字符。

\v垂直制表符
在Windows控制台中,垂直制表符并不能够在控制台中直接打印想要的制表效果,而是以一个特殊的字符来表示。
在Linux环境下,垂直制表符能够正常的实现垂直制表的效果。

\n\r换行和回车
在日常的使用中,我们经常习惯性的将换行和回车等同起来。换行就是回车,回车就是换行。或者说,回车用来换行,这里的回车更多的是指键盘上的Enter键。
实际上,回车和换行是两个不同的概念。
这个字符的产生和这个东西有关Teletype_Model_33

它们的由来网上是这么流传的:
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
– Unix系统里,每行结尾只有“<换行>”,即“\n”;
– Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;
– Mac系统里,每行结尾是“<回车>”。

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

从上面的文字中可以看出,实际上换行的功能本应该是由\n\r共同来完成的,后来在计算机中不同的系统出现了不同的规定。
但是我们知道在C语言中,换行的操作使用的是\n,但是上面的文字说在Windows下换行使用的是\n\r。这是不是有矛盾呢。
实际上并没有。
在Windows控制台下运行C语言,我们知道要换行时使用\n便能完成操作。但是当要向文件输出数据时,如果我们要实现换行,在代码中我们仍然可以使用\n来进行换行的操作。但是在文件实际的存储数据中,换行使用的是\n\r

简单说一下,在C语言中,如果\r后输出其他字符的话,之前在本行开头输出的字符将会被覆盖。
另外,从理论上讲,在Linux环境下\v\r组合也能够用于换行,但是在实际应用中并不会这样使用。

总结

所有转义字符和意义总结如下表

转义字符意义ASCII码值(10进制)
\a响铃(BEL)007
\b退格(BS) ,将当前位置移到前一列008
\f换页(FF),将当前位置移到下页开头012
\n换行(LF) ,将当前位置移到下一行开头010
\r回车(CR) ,将当前位置移到本行开头013
\t水平制表(HT) (跳到下一个TAB位置)009
\v垂直制表(VT)011
\ \代表一个反斜线字符’\’092
\’代表一个单引号(撇号)字符039
\”代表一个双引号字符034
\?代表一个问号063
\0空字符(NULL)000
\ooo1到3位八进制数所代表的任意字符三位八进制
\xhh1到2位十六进制所代表的任意字符二位十六进制

发表评论

电子邮件地址不会被公开。 必填项已用*标注