那些年被遗忘的细节

格式化字符串有讲究

输出格式化

读取格式化

1
2
// 从字符串读取格式化输入
int sscanf(const char *str, const char *format, ...)

str – 这是 C 字符串,是函数检索数据的源。
format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。

format 说明符形式为 [=%[*][width][modifiers]type=],具体讲解如下:

参数 说明
* 数据从 stream 中读取,但可以被忽略,不存储在对应的变量中。
width 指定读取的最大字符数
modifiers 类型修饰符,不同于 type 中的内容:
F远指针、N近指针、h有/无符短整型、l有/无符长整型、L长双精度。

type 类型说明符

说明符 描述 参数类型
c 单个字符。若 width 不为 1,读取 width 个字符。 char*
d 十进制整数:数字前面的 +/-号是可选的。 int*
e,E,f,g,G 浮点数:一个小数点.、一个可选+/-号、一个可选后置字符e/E、一个十进制数字。 float*
i 一个整数。 int*
o 八进制整数。
s 字符串。读取连续字符,知道遇见空白字符(空白、换行、制表符)。 char*
u 无符号十进制整数。 unsigned int *
x,X 十六进制整数。 int*
p 一个指针。 -
n 一个等于读取字符数量的整数。 int*
[] 一个字符集。 -
% 一个精度符号 -

经典示例:

  1. %s 输入字符串,末尾追加 ‘\0’;
  2. %ns n为整数,读入字符串最长不超过n,末尾追加 ‘\0’;
  3. %nf 读入浮点数,最多n位整数,多于n自动截断;
  4. %n[a-z] 读入最多n个字符,直到遇见非a-z的字符;
  5. %[^=] 读入任意多的字符,直到遇见=停止;
  6. %n[^=] 读入=前最多n个字符。

留言