C语言转义字符使用详解

转义字符的概念

所有的 ASCII码都可以用“\加数字” 来表示。而C 中定义了一些字母前加“\"来表示常见的那些不能显示的 ASCI 字符,如\t, \n 等,就称为转义字符,因为后面的字符,都不是它本来的 ASCII 字符意思了。(转义字符,顾名思义就是转变原来的意思)

转义字符是很多程序语言、数据格式和通信协议的形式文法的一部分。对于一个给定的字母表,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义。因此转义字符开头的字符序列被叫做转义序列

转义序列通常有两种功能

  1. 第一个是编码一个句法上的实体,如设备命令或者无法被字母表直接表示的特殊数据。
  2. 第二种功能,也叫字符引用,用于表示无法在当前上下文中被键盘录入的字符(如字符串中的回车符),或者在当前上下文中会有不期望的含义的字符(如C语言字符串中的双引号字符",不能直接出现,必须用转义序列表示)。在后面那种情况,转义序列是一种由转义字符自身和一个被引用的字符组成的一个二合字母(digraph)情形

关于转义字符的更多介绍——转义序列 - cppreference.com

 

转义字符表

转义字符
意义
ASCII码值(十进制)
\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
空字符(NUL)
000
\ddd
1到3位八进制数所代表的任意字符
三位八进制
\xhh
十六进制所代表的任意字符
十六进制

 

转义字符详解 和 实际使用示例

\a

警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣

#include<stdio.h>
int main()
{
	printf("\a");
	return 0;
}

 

\b

退格键,光标回退⼀个字符,但不删除字符

#include<stdio.h>
int main()
{
	printf("abcdef");
	return 0;
}

执行这段代码,程序正常打印abcdef

但在b之前加上\,变为转义字符\b之后

#include<stdio.h>
int main()
{
	printf("a\bcdef");
	return 0;
}

程序的执行结果变成了cdef

这是因为在打印a之后,\b为转义字符,光标回退到a之前,继续打印后面的内容会将a覆盖掉

所以c在将a覆盖掉之后,正常打印后面的def

 

\f

换页符,光标移到下⼀页。在现代系统上,这已经反映不出来了,行为改成类似于 \v

 

\n

换行符,将光标位置移动到下一行开头,这是日常写代码中最常用的转义字符

比较下面两段代码的区别

#include<stdio.h>
int main()
{
	printf("abcdef");
	return 0;
}

#include<stdio.h>
int main()
{
	printf("abc\ndef");
	return 0;
}

\n 的作用就是在它出现的地方,将光标移动到下一行

 

\r

回车符,光标移到同一行的开头

回车符与换行符类似,但不同的点在于回车符是将光标移动到本行的开头

比较下面两段代码的区别

#include<stdio.h>
int main()
{
	printf("abcdef");
	return 0;
}

#include<stdio.h>
int main()
{
	printf("abc\rdef");
	return 0;
}

可以观察到正常情况下,程序执行会打印abcdef

但在abcdef中间加上一个\r转义字符之后,在\r出现的位置,光标被移动到本行开头,所以后面的打印会依次覆盖掉前面已经打印过的内容

 

\t

制表符,光标移到下⼀个水平制表位(可以理解为若干个空格,具体取决于运行环境)

\t转义字符的作用相当于键盘上的 Tab 键

#include<stdio.h>
int main()
{
	printf("abc\tdef");
	printf("\n**********");
	return 0;
}

 

\v

垂直分隔符,光标移到下⼀个垂直制表位,通常是下一行的同⼀列

#include<stdio.h>
int main()
{
	printf("abc\vdef");
	return 0;
}

打印abc\vdef时,abc正常打印之后,\v将光标移动到下一行的同一列,之后继续打印def

 

\\

⽤于表示⼀个反斜杠,防⽌它被解释为⼀个转义序列符

例如,当我们想要打印 D:\code\test 这样一段文字的时候,如果直接打印的话,得不到我们想要的结果

#include<stdio.h>
int main()
{
	printf("D:\code\test");
	return 0;
}

上面这段代码中printf中的内容,第一个\被解释为一个转义字符,第二个\n和t被解释成\t,水平制表符

如果想要实现在屏幕上打印D:\code\test 应该用两个反斜杠表示一个正常打印的反斜杠,防止被解释成转义字符,如下所示

#include<stdio.h>
int main()
{
	printf("D:\\code\\test");
	return 0;
}

 

\'

⽤于表⽰字符常量',防止被编译器解释为成对使用的单引号

例如,我们确实只想打印一个单引号时,如果三个单引号放在一起,编译器就会报错,认为单引号没有成对出现

 

如果改成下面这段代码,将单引号写成\'  编译器才会理解我们确实只想打印一个单独的单引号

 

\"

⽤于表示⼀个字符串内部的双引号

规则和使用方法和上面的\' 类似,只有在写成\"的时候才能单独使用和打印一个双引号

 

写成\":

 

\?

在书写连续多个问号时使用,防止他们被解析成三字母词,在新的编译器上没法验证了

 

\0

NULL字符,代表没有内容, \0 就是 \ddd 这类转义字符的⼀种,⽤于字符串的结束标志,其 ASCII码值是0

关于\0需要记住最重要的一点是它是字符串的结束标志

字符串会默认在最后添加一个\0作为结束标志,但如果是多个字符的情况下,需要手动添加\0作为结束标志

#include<stdio.h>
int main()
{
	char arr1[] = {"abc"};
	char arr2[] = { 'a','b','c' }; //输出结果不可控
	char arr3[] = {'a','b','c','\0'};
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);
	return 0;
}

观察上面这段代码的执行结果,以不同的方式打印abc

字符串会默认添加\0作为结束标志,多个字符的情况下想要限定范围必须添加\0,否则就会像第二种,打印结果变得不可控(打印到\0才会停止,所以结果变得不可控)

 

\ddd

d d d表⽰1~3个⼋进制的数字 ,而\ddd表示1到3位八进制数字所代表的ASCII值 

如: \130表示字符X

130作为八进制在ASCII表对应的是字符X,或者将130转换为十进制为88,对应的ASCII值是X

 

\xhh

d d表示2个⼗六进制数字, 而\xdd表示2个十六进制数字所代表的ASCII值 

如:\x30表示字符0

30作为十六进制在ASCII表对应的是字符'0',或者将30转换为十进制为48,对应的ASCII值是字符'0'

 

关于转义字符在各种情况下的使用方法,没有办法一一列举出来,还是需要在实际使用中多加练习和注意

阅读剩余
THE END