关于C语言中的转义字符
所有的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) | 007 | Alert |
\b | 退格(BS) ,将当前位置移到前一列 | 008 | Backspace |
\f | 换页(FF),将当前位置移到下页开头 | 012 | form feed |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 | line feed |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 | return |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 | Tab |
\v | 垂直制表(VT) | 011 | vertical 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 |
\ooo | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 1到2位十六进制所代表的任意字符 | 二位十六进制 |