转义字符
转义字符在c语言中可谓是一名常客,在编辑代码时常常会用到它,这篇文章让我们一起来了解一下吧!
1.定义:
在c语言中,转义字符是一种特殊的字符序列,它通常以反斜杠(\)开头,由于所有的ASCII码都可以用"\"加数字(一般是8进制数字)来表示,于是便规定“\+字符”的格式来表示常见的那些不能显示的ASCII字符,如\n,\0,\t等,这些特殊的字符被称为转义字符,转义字符顾名思义,它与原本的意思不同,它们被赋予了新的功能与意义。
2.转义字符表:
转义字符 | 意义 | 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 | 空字符(NULL) | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 十六进制所代表的任意字符 | 十六进制 |
下面让我们看一看几个常见的转义字符:
1. \n (换行符)
a.用法:换行,当输入完一行内容后,光标转到下一行的起始位置
b.例子:
#include <stdio.h>
int main()
{
printf("你好");
printf("你好");
printf("你好");
return 0;
}
结果如下:
从结果上看,从输出的第二个结果开始,每一行的结果会直接跟在上一个输出结果的后面,这个例子是一个简单的例子,所以我们可以直接看出每个输出的结果。但是,当我们写一些比较复杂的代码时,它们的结果连在一起就不太容易看出来,所以,这时候就可以使用换行符来把每一个结果一行行的显示出来。
不使用换行符:
int main()
{
printf("%d", 16 + 24); //40
printf("%d", 23 * 24); //552
printf("%d", 10 - 2); //8
return 0;
}
结果如下:
当使用换行符时:
#include <stdio.h>
int main()
{
printf("%d/n", 16 + 24); //40
printf("%d/n", 23 * 24); //552
printf("%d/n", 10 - 2); //8
return 0;
}
结果如下:
2. \'
a.用法:表示一个单引号字符
b.例子:
#include <stdio.h>
int main()
{
printf("%c\n",'\'');
return 0; //结果输出'
}
由两个单引号组成的‘’表示该引用的是字符,由两个双引号组成的“”表示该引用的是字符串,在字符串中,无论写 \' 还是' ,输出的结果是一样的,对程序没有任何影响,但是在给字符变量赋值时,一定要写 \' ,否则会报错。
3. \"
a.用法:表示一个字符串内部的双引号
b.例子:
#include <stdio.h>
int main()
{
printf("%s\n", "\"");
return 0; //结果输出"
}
不使用转义字符(错误写法):
这时机器会将前两个""看为一个字符串 ,从而导致最后一个双引号多余出来。
4. \\
a.用法:表示一个反斜杠,防止它被解释为一个转义序列符
b.例子:
#include <stdio.h>
int main()
{
printf("c:\test\bac");
return 0;
}
结果:
在这个例子中,这是一个文件路径,当编译时机器会将\t,\b看为转义字符,机器输出的结果与我们想要输出的不同,这时想要输出文件路径,就需要用到反转义字符。
ps:为什么会是这个结果?因为\t转义字符中的t其实就是电脑中的tab键,一个tab键为8个空格,即就是在\t前共有8个字符,转义字符不输出,所以\t后面的est输出,但又由于\b也为转义字符,它的用法是退格,将当前位置移到前一列,所以\b前面的t就会被\b后面的a所覆盖,于是便是这个结果。
使用\\时:
#include <stdio.h>
int main()
{
printf("c:\\test\\bac");
return 0;
}
结果:
(这时发现这个路径被完整的输出出来了。)
5. \ddd(八进制转义字符)
a.用法:表示1~3个八进制的数字,d的范围是0~7
b.例子:
#include <stdio.h>
int main()
{
printf("%c\n", '\150'); //150是8进制,转换成10进制是104,查找值为104的ASCII码的字符
return 0;
}
结果:
如果其中有数字超出八进制的范围,则输出末尾数字。
#include <stdio.h>
int main()
{
printf("%c\n", '\128'); //8超出八进制的范围,\12被看成一个转义字符
return 0;
}
结果:
6. \xhh (十六进制转义字符)
a.用法:hh表示两个十六进制的数字
b.例子:
#include <stdio.h>
int main()
{
printf("%c\n", '\x32'); //32是16进制,转换成10进制是50,查找值为50的ASCII码的字符
return 0;
}
结果:
7. \0(空字符)
a.用法:表示空字符,即没有内容,\0 就是属于 \ddd 这类转义字符的一种。
b.例子:
#include <stdio.h>
int main()
{
char a[] = "123"; //数组a
char b[] = { '1','2','3' }; //数组b
printf("%s\n", a);
printf("%s\n", b);
return 0;
}
结果:
看到这里会有个疑惑,为什么第二行会有乱码,而第一个输出结果却没有,这时我们在编程软件上进行逐条分析,如下图所示:
这时就会发现,在字符串123后面有一个隐藏的\0出现,而b中却没有。所以,我们可以认为当打印字符串时,遇到\0的时候打印结束,如果无\0则直到在空间外找到一个\0为止,即\0是字符串结束的标志。
当我们在数组b中加一个\0时:
#include <stdio.h>
int main()
{
char b[] = { '1','2','3','\0'};
printf("%s\n", b);
return 0;
}
结果如下: