一、什么是转义字符
转义字符(Escape character),所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C语言中定义了一些字母前加""来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符;在平常的代码编写中,printf函数经常会用到。
转义字符虽然由两个及两个以上的字符构成,但它表示的却是单个字符
简单转义字符(Simple escape sequence)
转义字符 | 含义 | 说明 |
\0 | 空字符(NULL) | 在c语言中代表“字符串结束符” |
\a | 警报符(alert) | 发出听觉或视觉上的警报 |
\b | 退格符(backspace) | 将当前位置移到前一列 |
\f | 换页符(form feed) | 换页,将当前位置移到下一页开头 |
\n | 换行符(new line) | 换行,将当前位置移到下一行开头 |
\r | 回车符(carriage return) | 将当前位置移到本行开头 |
\t | 水平制表符(horizontal tab) | 将当前位置移动到下一个水平制表位置 |
\v | 垂直制表符(vertical tab) | 将当前位置移动到下一个垂直制表位置 |
\\ | 字符\ | |
\? | 字符 ? | |
\’ | 字符 ’ | |
\" | 字符 " |
八进制转义字符(Simple escape sequence)
转义字符 | 含义 | 说明 |
\ddd | ddd是3位八进制数 | 一般来说是在ASCII中的八进制数值为ddd的字符 |
十六进制转义字符(Simple escape sequence)
转义字符 | 含义 | 说明 |
\xhh | hh是2位十六进制数 | 一般来说是在ASCII中的十六进制数值为hh的字符 |
二、简单转义字符
1、空字符
空字符\0
它的存在是为了告诉编译器’\0’是空字符,而不是字符0.
字符’0’对应的ASCII码为00110000,而’\0’对应的ASCII码为00000000;在C语言中通常用一个字符数组来存放字符串,’\0’ 是字符串的结束标志,任何字符串之后都会自动加上’\0’。如果字符串末尾少了‘\0’转义字符,则在输出时可能会出现乱码问题。
比如:
int main() { char str1[] = {"abc"}; char str2[] = {"abc\0"}; return 0; }
上述代码中str1与str2在打印输出时均为abc,
包括在使用库函数strlen计算时,str1与str2均为3,
原因是printf函数与strlen函数均认定’\0’ 是字符串的结束标志;
但在使用单引号进行赋值的时候,这两个函数可能会出现一些问题。
比如:
int main() { char str1[] = {'a','b','c'}; char str2[] = {'a','b','c','\0'}; return 0; }
在上述代码中如果我们使用printf函数与strlen函数进行打印输出和计算str1时,
该数据类型会丢失’\0’ ,此时打印的时候可能会出现乱码情况和计算出随机值的情况,
这时如果非要用单引号进行赋值的话,建议使用str2的写法。
在使用库函数sizeof进行字符串计算时,输出个数会比实际字符个数多1,
比如:
int main() { char str[] = {"abc"}; return 0; }
在上述代码中,如果使用sizeof函数对字符串str进行运算时,得出的结果应该是4,而不是3,所以如果使用固定值对元素个数进行赋值时,在方括号[]中应该输入的是4,而不是3。
2、警报符
警报符\a
C语言中的转义字符\a(响铃)是在标准输出设备输出字符’\a’时,系统自带的扬声器(或蜂鸣器)会发出“叮”的一声(有些环境不发出声音,只令画面闪烁)
#include <stdio.h> int main() { printf("\a你好"); return 0; }
在上述输出代码中输出你好时,你会听见“叮”的一声(不同操作系统提示音可能不同);
3、退格符
退格符\b
输出退格符\b后,当前显示位置就会移动到当前所在行的前一个字符。
并没有规定当前显示位置处于所在行的开头时输出退格符会怎么样,这是因为光标在某些环境下回不到前一行。那么我们怎么运用呢?
比如:
#include <stdio.h> int main() { printf("12345\n67\b\b\b\b89"); return 0; }
效果:
12345 89
在上述代码中在12345后使用换行符\n,正常我们使用两个退格符就能达到上述效果,
而在这里我使用了4个,是因为不论使用几个,退格符都不会再向上访问了。
下面我们再写一个有趣的代码:
#include <stdio.h> #include <Windows.h> int main() { printf("HelloWorld!"); for (int i = 0; i < 11; i++) { Sleep(1000);//每隔一秒 printf("\b \b");//从后出个消除 fflush(stdout);//清空缓冲 } return 0; }
上述代码我们调用一个sleep函数和一个for循环,产生的效果如下:
4、换页符
换页符\f
输出换页符\f后,当前的显示位置就会移动到下一个逻辑页面的开头位置,
但在控制台面板中,即使你使用换页符输出,也不会发生任何事情(会多一个空行,肉眼看不见)。
比如:
#include <stdio.h> int main() { printf("你好\f"); return 0; }
效果和不输入换页符输出也是一样的。
实际在打印输出需要换页时才会用到换页符
5、换行符
换行符\n
换行符是我们在学习C语言过程中可能经常会用到的转义字符,
输入换行符后,当前显示位置就会移动到下一行的开头。
比如:
#include <stdio.h> int main() { printf("你好\n"); printf("\n"); printf("程序员"); return 0; }
输出结果:
你好 程序员
6、回车符
换行符\r
输出回车符\r后,当前显示位置就会移动到本行开头,灵活应用回车符,我们就能重写已经在画面上显示出来的字符。回车符(‘\r’)和换行符(‘\n’)都是c语言中的一种语言表达方式,前者的作用是输入完一行内容后光标回到当前行的开头却不向下移一行,而后者的作用是跳到下一个新行,输入完一行内容后光标下移一行却不会移到这一行的开头。
我们以下面代码为例:
#include <stdio.h> #include <Windows.h> int main() { printf("你是谁"); fflush(stdout);//清空缓冲 Sleep(2000);//间隔两秒 printf("\r程序员"); return 0; }
效果:
你是谁
两秒后
程序员
可以看到这段代码可以直接清除本行(调用了fflush)再重新输出,而回车符的作用则是把光标重定位到开头,达到辅助效果;但在这里需要注意的是,如果新输出的字符串比原先显示的字符串短,那么原先显示的字符就不会消失,始终留在原位。
比如:
#include <stdio.h> #include <Windows.h> int main() { printf("你是谁"); fflush(stdout); Sleep(2000); printf("\r程序"); return 0; }
则输出是:
你是谁
两秒后
程序谁