注:本文为 “C 语言转义序列” 相关合辑。
略作重排,未整理去重。
如有内容异常,请看原文。
对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解
boyinnju 于 2011-10-16 00:01:06 发布
C 语言空白字符解析
1 概述
C 标准库头文件 ctype.h 提供如下接口:
int isspace(int c);
该函数判定参数 c 是否属于标准空白字符。依据 ISO/IEC 9899:2018 §7.4.1.10,空白字符集包含以下 6 个字符:
| 字符 | 转义序列 | 十进制码值 | 十六进制码值 | 名称 |
|---|---|---|---|---|
| SP | ' ' | 32 | 0x20 | 空格 |
| HT | '\t' | 9 | 0x09 | 水平制表符 |
| VT | '\v' | 11 | 0x0B | 垂直制表符 |
| FF | '\f' | 12 | 0x0C | 换页符 |
| CR | '\r' | 13 | 0x0D | 回车符 |
| LF | '\n' | 10 | 0x0A | 换行符 |
下文分节讨论各字符的语义、终端行为与文件存储差异。
2 空格 (SP, 0x20)
空格字符的编码为 0x20,而非 0x00。后者表示空字符(NULL),常用于字符串终止。
3 回车符 (CR, '\r')
回车符仅将光标移至当前行行首,不隐含换行。若后续仍有输出,则会产生覆盖。
示例:
puts("hello world!\rxxx");
终端实际显示:
xxxlo world!
若将相同字节序列写入文本文件,不同编辑器呈现如下:
-
vi:以
^M显示0x0D
-
Windows 记事本:不呈现控制图形

4 换行符 (LF, '\n')
换行符将光标移至下一行,列位置保持不变。终端输出与文件存储行为存在系统差异:
| 系统 | 行尾序列 |
|---|---|
| Unix | LF |
| Windows | CR LF |
| macOS | CR |
5 水平制表符 (HT, '\t')
水平制表符用于实现“跳格”对齐,默认制表宽度为 8 列。其停止位满足列号:
column = 8 n , n ∈ N 0 \text{column} = 8 n,\quad n \in \mathbb{N}_0 column=8n,n∈N0
示例:
puts("0123456\txx");
puts("0123456t\txx");
终端输出:

6 垂直制表符 (VT, '\v')
垂直制表符使后续字符从下一行、当前列 +1 位置开始输出,常用于早期打印设备。
示例:
puts("01\v2345");
终端输出:

7 换页符 (FF, '\f')
换页符在终端中等价于执行 clear 命令:先清屏,再输出后续内容。若写入文本文件,多数编辑器将其视为普通控制字符,无清屏语义。
8 小结
字符 '\r'、'\t'、'\v'、'\f' 均属控制字符,其可视化效果取决于输出环境:
- 终端:按控制语义解释
- 文本文件:由编辑器自行决定呈现方式,通常不触发控制动作
转义序列字符(\0,\n,\r,\t,\v,\a,\f,\b,\,\‘,\“,?)详解,转义字符对应的全称,输出结果和对应的ASCII码值详解
南城花开过 于 2022-12-10 08:54:21 修改
环境说明:64-bit Windows + MinGW64。不同设备、编译器或终端环境下,部分转义序列的表现可能存在差异。
1 引言
转义序列(Escape Sequence)以反斜杠 \ 引导,用于表示无法直接输入(如控制字符)或具有特殊语义的字符。每个转义序列对应唯一的 ASCII 码值,且在输出时表现出特定的行为逻辑,是 C 语言处理字符输出的基础。
2 转义序列总览(汇编 & 编程场景 ASCII 码值)
| 转义字符 | 英文全称 | 说明 | ASCII 码值(汇编) | ASCII 码值(编程) |
|---|---|---|---|---|
\0 | NULL | 字符串结束标记(空字符) | 00H / 0 | 0x00 / 0 |
\n | New Line | 换行,光标移至下一行开头 | 0AH / 10 | 0x0A / 10 |
\r | Carriage Return | 回车,光标移至当前行行首 | 0DH / 13 | 0x0D / 13 |
\t | Horizontal Tab | 水平制表符(等效按 Tab 键,默认 8 空格缩进) | 09H / 9 | 0x09 / 9 |
\v | Vertical Tab | 垂直制表符,后续字符从下一行下一列开始输出 | 0BH / 11 | 0x0B / 11 |
\a | Bell (Alert) | 响铃(终端发出提示音) | 07H / 7 | 0x07 / 7 |
\f | Form Feed | 换页符,清空当前输出区域后换行输出 | 0CH / 12 | 0x0C / 12 |
\b | Backspace | 退格,光标左移一位(覆盖前一字符) | 08H / 8 | 0x08 / 8 |
\\ | Backslash | 输出转义后的反斜杠:\ | 5CH / 92 | 0x5C / 92 |
\? | Question Mark | 输出问号:? | 3FH / 63 | 0x3F / 63 |
\' | Single Quote | 输出单引号:' | 27H / 39 | 0x27 / 39 |
\" | Double Quote | 输出双引号:" | 22H / 34 | 0x22 / 34 |
3 典型转义序列示例
3.1 \0:空字符(字符串结束标志)
- 功能:作为字符串的终止符,系统会自动添加在字符串末尾;程序输出字符串时,遇到
\0即停止输出。 - 示例代码:
#include <stdio.h> int main() { printf("hello world\0test"); // \0 后的 "test" 不会输出 return 0; } - 输出结果:
hello world
3.2 \n:换行符
- 功能:将输出光标移动到下一行的起始位置,是最常用的换行控制符。
- 示例代码:
#include <stdio.h> int main() { printf("第一行内容\n第二行内容"); return 0; } - 输出结果:
第一行内容 第二行内容
3.3 \r:回车符
- 功能:仅将光标移至当前行开头,不换行、不删除原有内容,后续输出会覆盖行首字符。
- 示例代码(回车+覆盖):
#include <stdio.h> int main() { printf("hello world\rworld"); // 光标回行首后,"world" 覆盖前 5 个字符 return 0; } - 输出结果:
world world
3.4 \t:水平制表符
- 功能:等效于按下 Tab 键,用于快速对齐输出内容(默认缩进 8 个空格)。
- 示例代码:
#include <stdio.h> int main() { printf("姓名\t年龄\t性别\n"); printf("张三\t20\t男\n"); return 0; } - 输出结果:
姓名 年龄 性别 张三 20 男
3.5 \v:垂直制表符
- 功能:后续字符从下一行、当前字符的下一列开始输出,与
\f行为相似但不清空屏幕。 - 示例代码:
#include <stdio.h> int main() { printf("hello\vworld"); // "world" 从下一行第 6 列开始输出 return 0; } - 输出结果:
hello world
3.6 \a:响铃符
- 功能:触发终端响铃(无字符输出,仅听觉提示)。
- 示例代码:
#include <stdio.h> int main() { printf("操作完成\a"); // 输出"操作完成"后终端响铃 return 0; } - 输出结果:
(终端同时发出提示音)操作完成
3.7 \f:换页符
- 功能:清空当前输出区域后换行输出,行为接近
\v但会重置输出区域。 - 示例代码:
#include <stdio.h> int main() { printf("原有内容\f新内容"); // 清空原有内容后输出"新内容" return 0; } - 输出结果:
新内容
3.8 \b:退格符
- 功能:光标左移一位,覆盖前一个字符(而非真正删除)。
- 示例代码:
#include <stdio.h> int main() { printf("hello!\bk"); // \b 覆盖"!"为"k" return 0; } - 输出结果:
hellok
3.9 转义符(\\/\?/\'/\")
此类转义序列用于输出具有特殊语义的字符(本身是转义符或引号),功能为“输出字符本身”,示例如下:
| 转义字符 | 示例代码 | 输出结果 |
|---|---|---|
\\ | printf("\\"); | \ |
\? | printf("\?"); | ? |
\' | printf("\'"); | ' |
\" | printf("\""); | " |
4 总结
C 语言转义序列本质是“多字符表示单一语义字符”,其 ASCII 码值由标准定义,输出行为则受运行环境(操作系统、终端、编译器)影响。
C 语言空白字符与控制转义序列
依据:ISO/IEC 9899:2018 (C17)、POSIX.1-2017、Linux man-pages 6.9
1 转义序列全集(标准 + 通用扩展)
| 序列 | 码值 | 标准 | 说明 |
|---|---|---|---|
| \0 | 0x00 | ● | 字符串结束(空字符) |
| \a | 0x07 | ● | 告警(蜂鸣) |
| \b | 0x08 | ● | 退格 |
| \t | 0x09 | ● | 水平制表 |
| \n | 0x0A | ● | 换行 |
| \v | 0x0B | ● | 垂直制表 |
| \f | 0x0C | ● | 换页 |
| \r | 0x0D | ● | 回车 |
| " | 0x22 | ● | 双引号 |
| ’ | 0x27 | ● | 单引号 |
| ? | 0x3F | ● | 问号 |
| \ | 0x5C | ● | 反斜杠 |
| \e | 0x1B | ○ | ESC(GCC/Clang 扩展) |
【数值写法】
- 八进制:
\033 - 十六进制:
\x1B - 与上述扩展等价:
\e
2 易错点与未定义行为
-
负值参数
char c = -5; if (isspace(c)) /* 未定义行为 */改正:
if (isspace((unsigned char)c)) ... -
二进制流误用文本模式
FILE *fp = fopen("data.bin", "w"); /* 应使用 "wb" */ fwrite("\n", 1, 1, fp); /* Windows 会写入 0x0D 0x0A */ -
混用 \r 与 \n 导致覆盖
- 示例:
printf("hello\rxx");会显示xxllo - 刷新行缓冲可用
fflush(stdout)
- 终端特定行为依赖
- 不同终端对控制字符的处理可能不同
- 应避免依赖特定终端的行为
小结
- 空白字符仅 6 个,
isspace()结果与区域设置无关 - 控制字符在"终端"与"文件"表现可能不同
- 转义序列在编译期解析为单个 char 值
- 理解其数值有助于调试跨平台差异
- 文本流和二进制流的区别需要特别注意
掌握各转义序列的数值与效应,可精准控制字符输出格式,避免因平台差异导致的显示异常(如换行/回车在 Windows 与 Linux 下的表现差异),是编写健壮字符处理程序的基础。
via:
- 对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解_c语言空格符号是什么-优快云博客
https://blog.youkuaiyun.com/boyinnju/article/details/6877087 - 转义序列字符(\0,\n,\r,\t,\v,\a,\f,\b,\,\‘,\“,?)详解,转义字符对应的全称,输出结果和对应的ASCII码值详解;-优快云博客
https://blog.youkuaiyun.com/2201_75670821/article/details/128247316
1979

被折叠的 条评论
为什么被折叠?



