C 语言转义序列 | 标准空白字符特性与常用转义符用法

注:本文为 "C 语言转义序列" 相关合辑。

略作重排,未整理去重。

如有内容异常,请看原文。


对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解

boyinnju 于 2011-10-16 00:01:06 发布

C 语言空白字符解析

1 概述

C 标准库头文件 ctype.h 提供如下接口:

c 复制代码
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')

回车符仅将光标移至当前行行首,不隐含换行。若后续仍有输出,则会产生覆盖。

示例:

c 复制代码
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

示例:

c 复制代码
puts("0123456\txx");
puts("0123456t\txx");

终端输出:

6 垂直制表符 (VT, '\v')

垂直制表符使后续字符从下一行、当前列 +1 位置开始输出,常用于早期打印设备。

示例:

c 复制代码
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 即停止输出。

  • 示例代码

    c 复制代码
    #include <stdio.h>
    int main() {
        printf("hello world\0test"); // \0 后的 "test" 不会输出
        return 0;
    }
  • 输出结果

    复制代码
    hello world

3.2 \n:换行符

  • 功能:将输出光标移动到下一行的起始位置,是最常用的换行控制符。

  • 示例代码

    c 复制代码
    #include <stdio.h>
    int main() {
        printf("第一行内容\n第二行内容");
        return 0;
    }
  • 输出结果

    复制代码
    第一行内容
    第二行内容

3.3 \r:回车符

  • 功能:仅将光标移至当前行开头,不换行、不删除原有内容,后续输出会覆盖行首字符。

  • 示例代码(回车+覆盖)

    c 复制代码
    #include <stdio.h>
    int main() {
        printf("hello world\rworld"); // 光标回行首后,"world" 覆盖前 5 个字符
        return 0;
    }
  • 输出结果

    复制代码
    world world

3.4 \t:水平制表符

  • 功能:等效于按下 Tab 键,用于快速对齐输出内容(默认缩进 8 个空格)。

  • 示例代码

    c 复制代码
    #include <stdio.h>
    int main() {
        printf("姓名\t年龄\t性别\n");
        printf("张三\t20\t男\n");
        return 0;
    }
  • 输出结果

    复制代码
    姓名    年龄    性别
    张三    20      男

3.5 \v:垂直制表符

  • 功能 :后续字符从下一行、当前字符的下一列开始输出,与 \f 行为相似但不清空屏幕。

  • 示例代码

    c 复制代码
    #include <stdio.h>
    int main() {
        printf("hello\vworld"); // "world" 从下一行第 6 列开始输出
        return 0;
    }
  • 输出结果

    复制代码
    hello
         world

3.6 \a:响铃符

  • 功能:触发终端响铃(无字符输出,仅听觉提示)。

  • 示例代码

    c 复制代码
    #include <stdio.h>
    int main() {
        printf("操作完成\a"); // 输出"操作完成"后终端响铃
        return 0;
    }
  • 输出结果

    复制代码
    操作完成

    (终端同时发出提示音)

3.7 \f:换页符

  • 功能 :清空当前输出区域后换行输出,行为接近 \v 但会重置输出区域。

  • 示例代码

    c 复制代码
    #include <stdio.h>
    int main() {
        printf("原有内容\f新内容"); // 清空原有内容后输出"新内容"
        return 0;
    }
  • 输出结果

    复制代码
    新内容

3.8 \b:退格符

  • 功能:光标左移一位,覆盖前一个字符(而非真正删除)。

  • 示例代码

    c 复制代码
    #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 易错点与未定义行为

  1. 负值参数

    c 复制代码
    char c = -5;
    if (isspace(c))   /* 未定义行为 */

    改正:

    c 复制代码
    if (isspace((unsigned char)c)) ...
  2. 二进制流误用文本模式

    c 复制代码
    FILE *fp = fopen("data.bin", "w"); /* 应使用 "wb" */
    fwrite("\n", 1, 1, fp);            /* Windows 会写入 0x0D 0x0A */
  3. 混用 \r 与 \n 导致覆盖

  • 示例:printf("hello\rxx"); 会显示 xxllo
  • 刷新行缓冲可用 fflush(stdout)
  1. 终端特定行为依赖
  • 不同终端对控制字符的处理可能不同
  • 应避免依赖特定终端的行为

小结

  • 空白字符仅 6 个,isspace() 结果与区域设置无关
  • 控制字符在"终端"与"文件"表现可能不同
  • 转义序列在编译期解析为单个 char 值
  • 理解其数值有助于调试跨平台差异
  • 文本流和二进制流的区别需要特别注意

掌握各转义序列的数值与效应,可精准控制字符输出格式,避免因平台差异导致的显示异常(如换行/回车在 Windows 与 Linux 下的表现差异),是编写健壮字符处理程序的基础。


via: