C语言入门 | 深刻理解转义字符 📅 2026/8/5 11:26:26 一、转义字符是什么顾名思义就是转变原来意思的字符。举例n本来就是单纯的字符n但是‘\n’就和字符n没有任何关系但它可以实现换行的功能。#include stdio.h int main() { printf(abcndef); return 0; }#include stdio.h int main() { printf(abc\ndef); return 0; }二、转义字符有哪些速览\? 在书写连续多个问号时使用防止被编译器解析成三字母词\ 用于表示字符常量 \ 用于表示一个字符串内部的双引号\\ 用于表示一个反斜杠防止它被解释为转义序列符\a 警报使得终端发出警报声或出来闪烁或者两者同时发生\b 退格键光标回退一个字符但不删除字符\f 换页符光标移到下一页。现在基本不用本文不做详细讲解\n 换行符\r 回车符光标移到同一行的开头\t 水平制表符光标移动到下一个水平制表位通常是4或8的倍数\v 垂直分隔符光标移动到下一个垂直制表位。现在基本不用本文不做详细讲解\ddd d d d表示1~3个八进制的数字。 可以理解为字符的八进制表示形式。如\130 表示字符X\xdd d d表示2个十六进制数字。可以理解为字符的十六进制表示形式。如\x30 表示字符0三、给转义字符分类分类依据根据各自的实际用途以及在ASCII码表中的排列1.控制转义字符ASCII 7~13我们知道ASCII码从0到31总共32个是不可打印字符全部是不可见硬件指令。我们上面聊到的转义字符产生的效果中有共有7个来自这里转义字符名称ASCII\a响铃 Alert7\b退格 Backspace8\t水平制表 Tab9\n换行 Newline10\v垂直制表 Vertical Tab11\f换页 Form feed12\r回车 Return13以下是个人的思考可以选择性阅读我曾经一直纳闷的一个问题是为什么不直接把转义字符本来的样子如“\a” \b等直接放到ASCII码表的“ch”栏而是要用“BEL(响铃)” “BS(退格)”等这样的方式表示后来查阅资料终于明白了ASCII码表诞生早于C语言。在创造ASCII码的时候人们就知道这类指令确实没有图案但总不能画一个空白框吧所以人们给每个控制字符起英文名字用缩写代表它的功能含义。这些英文缩写才是标准名称给工程师、硬件手册、协议文档使用。C语言是后来单独设计的源代码语法\a \b这种转义字符只是方便程序员书写看不见的控制字符。2.符号转义字符转义字符作用ASCII\输出单引号39\输出双引号34\\输出反斜杠\92\?输出问号?63这4个转义字符的最终效果都是可输出各自的原始字符而原始字符在ASCII表中属于可见字符。到这里会不会有小伙伴有这样的问题那ASCII码值中的 单引号 双引号 斜杠 \ 问号? 到底带不带斜杠呢其实ASCII码表里面的这些符号只有纯字符这一套带斜杠的写法只是C语言源代码的语法标记而已和ASCII码没有任何关系如果还是迷糊也不要紧下文将会举很多例子帮助理解。3.通用数值转义上述两类每一种转义字符只能固定代表唯一1个字符但 \ddd 和 \xhh 却可以通过修改数字表达ASCII码中任意单个字符。四、逐个详解按照ASCII码表的顺序1. \a警报使得终端发出警报声或出来闪烁或者两者同时发生。#include stdio.h int main() { printf(\a); return 0; }在笔者使用的设备上这段代码运行的效果是警报声也没有办法在此呈现读者可在自己的电脑上感受效果至于闪烁效果则和终端模拟器程序有关这里不做详解读者可以自行查阅资料学习。2. \b退格键光标回退一个字符但不删除字符。我们先来看没有 \ 的效果#include stdio.h int main() { printf(climb); return 0; }加上 \ 后呢#include stdio.h int main() { printf(clim\b); return 0; }这个结果看起来是不是有些矛盾呢明明是光标回退一个字符且不删除字符但这个结果看上去删除了一个字符why?先不着急回答这个问题来看一下 F10逐过程调试VS2026的结果逐过程调试可以理解为一句一句地执行代码这样做可以让我们更加明白代码是如何一步一步被执行的看来确实只是光标退回一格并没有删除字符。只是VS的终端渲染特性导致最终程序运行的视觉效果是少了一个m。这里就不过度深究了不然偏离主题了~我们换一个平台用Dev CDev C就没有出现这样的情况当然如果非要在VS上让最后的m显现出来也是可以的用一个换行符 \n#include stdio.h int main() { printf(clim\b\n); return 0; }如果 \b 真的在退格的同时删除了m字符那么就不会呈现这样的效果啦。可能有些小伙伴会想为什么m不会去下一行不是换行了吗因为换行符 \n 只是移动光标到下一行并不会把字符也搬下去。上面的代码是将\b放在最后如果有\b后面还有内容会怎么样呢我们来试试#include stdio.h int main() { printf(clim\b\bab); return 0; }也就是说如果\b后面有其他字符那么\b前面的字符将会被覆盖。3. \t水平制表符光标移动到下一个水平制表位通常是4或8的倍数。\t一般是用来做数据的对齐的。我们先来试试效果#include stdio.h int main() { printf(a\tbc\tdef\tghij\tklmno\tw); return 0; }从最终的运行结果中我们可以看出只要出现 \t 控制台就会预留出一定的位置使得空出来的位置和前面字符所占的位置加起来总共是8个字符的位置VS默认是这样的。那如果\t前面的字符超过8个会怎么样呢#include stdio.h int main() { printf(abcdefghij\tklmno\tw); return 0; }那就会从第9个开始算。那如果更多呢道理是一样的。快去动手验证一下自己的想法吧4. \n换行符。这可是老朋友了这里就只放一段代码给大家呈现一下效果#include stdio.h int main() { printf(abc\ndef); return 0; }这个符号用的太多了所以笔者这里不再做过多赘述。主要是和下一个回车符 \r 做区分。5. \r回车符光标移到同一行的开头。\n是真的换到了下一行而\r则是移到同一行的开头。来看效果#include stdio.h int main() { printf(abcdef\r); return 0; }上面第二张图是程序运行的最终效果为什么会少了字母a还是和VS的终端渲染特性有关。因此放了第三张逐过程调试的图可以看到光标确实是回到了同一行的开头。那如果\r后面还有其他字符呢我们来试试这次直接放逐过程调试的图了#include stdio.h int main() { printf(abcdef\rghi); return 0; }到此控制转义字符就讲解完了下面是符号转义字符主要研究他们分别在什么场景下使用。6. \用于表示一个字符串内部的双引号。如果我们想在字符串中打印 ,比如打印 abcdef,如果直接打印会发生什么我们试试#include stdio.h int main() { printf(%s\n, abcdef); return 0; }直接发生了编译错误为什么呢因为编译器在编译这段代码时会把我们需要打印到屏幕上的那个 看作是字符串结束的那个双引号也就是要打印的那个双引号和前面的双引号组成了一对编译器看不懂了。因此C语言有了相关的语法规定在字符串中出现的 必须变成 \ 加了斜杠的双引号就失去了和别的双引号成对的可能使得其就是一个普普通通的双引号。我们再试试#include stdio.h int main() { printf(%s\n, abc\def); return 0; }这样就没问题了。再举一个例子就只打印一个 注意\的应用场景只是在字符串当中如果是要打印字符 那当然是没问题的7. \用于表示字符常量 。道理和 \ 是一模一样的这里就不过多赘述了只不过是在打印单个字符的情景中出现来看看这段代码#include stdio.h int main() { printf(%c\n, ); return 0; }在大家的预料之中编译失败了那加上斜杠之后呢#include stdio.h int main() { printf(%c\n, \); return 0; }这样就可以正常打印了你学会了吗8. \?在书写连续多个问号时使用防止被编译器解析成三字母词。这里没有办法给大家验证展示了。因为只有老式的编译器才会将连续多个问号解析成三字母词现在的编译器基本都比较新的自然就没有办法给大家展示了。但我们依旧可以用文字进行说明比如你想在屏幕上打印(what are you 弄啥嘞??),如果不使用转义字符老式的编译器就会将??)解析成]打印出来(what are you 弄啥嘞]。如果在?前加上\就等于告诉编译器我这个?就是单独的问号不会和别的符号进行组合变成一个转义字符9. \\用于表示一个反斜杠防止它被解释为转义序列符。不知道大家有没有这样的疑问\加上一个其他字符就可以发挥一些不一样的作用那如果想打印\本身那这个\会不会被误解呢实践出真知这里我们举2个例子。首先是打印字符 \如果只打1个\看来编译器是把 \ 和它后面的 读成 \ 了。那怎么办呢正所谓解铃还须系铃人前面再加1个 \ 试试所以 \\ 就表示一个真正的斜杠也许可以理解为前一个 \ 不让后一个 \ 和别的字符组合。再试试打印字符串如果单个 \ 后面遇到了可以组合的字符那么就会形成转义字符。那如果 \ 后面是不能组合的字符呢我们会发现就算 \ 后面没有字符可以与之组合\ 也不会被打印出来这是因为MSVCVS编译器的规则是遇到未知转义序列就直接丢弃 \ 只保留后面的字符那好吧只能老老实实再打上一个 \ 了10.\ddd可以理解为字符的八进制表示形式。比如\130130是八进制数字换算成十进制数是88进制转换不作详细讲解ASCII码值是88的字符是大写的X\130代表的就是X字符X真的是这样吗#include stdio.h int main() { printf(%c\n, \130); return 0; }到这里细心的朋友可能会发现从开始到现在好像还没有提到过 \0 就是那个字符串的结束标志。没错因为 \0 是 \ddd 的一种代表ASCII码值为0的字符也就是null字符11.\xdd可以理解为字符的十六进制表示形式。比如\x30x代表十六进制30是十六进制数字换算成十进制数是48ASCII码值是88的字符是数字0\x30代表的就是0字符0再来验证一下#include stdio.h int main() { printf(%c\n, \x30); return 0; }如果还是不太相信可以自己再换一个字符去尝试哦~五、小试牛刀#include stdio.h #include string.h int main() { int len1 strlen(c:\test\16\test.c); int len2 strlen(c:\test\\16\test.c); //strlen函数统计的是字符串中\0之前的字符个数不包含\0 printf(len1%d,len2%d, len1, len2); return 0; }上面这段代码中len1,len2分别等于多少?答案公布在评论区感谢观看完