每个格式规范以百分号字符 (%) 开头。其他字段为:* 一个可选标记;如果存在,它将抑制对当前输入字段的解释和赋值。width 一个可选的最大字段宽度:一个十进制整数,用于控制在转换当前输入字段之前将读取的最大字符数。如果输入字段的字符数少于 width,scanf 将读取该字段中的所有字符,然后继续处理下一个字段及其格式规范。如果在读取 width 个字符之前出现空白或不可转换的字符,则读取直到该字符为止的字符,并进行转换和存储。然后 scanf 继续处理下一个格式规范。size h、l 和 L 是可选的大小字符,它们覆盖 scanf 解释相应参数数据类型的默认方式。修饰符 类型 h d, i, o, u, x 将输入转换为 short,存储在 short 对象中 h D, I, O, U, X 无效 e, f, c, s, n, p l d, i, o, u, x 将输入转换为 long,存储在 long 对象中 l e, f, g 将输入转换为 double,存储在 double 对象中 l D, I, O, U, X 无效 c, s, n, p L d, i, o, u, x 转换为 long double,存储在 long double 中 L 所有其他 无效 type 一个字符,用于指定 scanf 执行哪种转换。以下是转换字符表:% 不进行转换;存储百分号字符 (%)。c 扫描一个字符。对应的 arg:(char *arg)。s 将字符串读入提供的数组中。对应的 arg:(char arg[])。[pattern] 将非空字符串读入从 arg 开始的内存中。该区域必须足够大以接受该序列以及将自动添加的终止空字符。(pattern 在本表后面的段落中讨论)。对应的 arg:(char *arg)。d 将十进制整数读入对应的 arg:(int *arg)。D 将十进制整数读入对应的 arg:(long *arg)。o 将八进制整数读入对应的 arg:(int *arg)。O 将八进制整数读入对应的 arg:(long *arg)。u 将无符号十进制整数读入对应的 arg:(unsigned int *arg)。U 将无符号十进制整数读入对应的 arg:(unsigned long *arg)。x,X 将十六进制整数读入对应的 arg:(int *arg)。e, f, g 将浮点数读入对应的 arg:(float *arg)。E, F, G 将浮点数读入对应的 arg:(double *arg)。i 将十进制、八进制或十六进制整数读入对应的 arg:(int *arg)。I 将十进制、八进制或十六进制整数读入对应的 arg:(long *arg)。n 将读取的字符数存储在对应的 arg:(int *arg) 中。p 存储扫描到的指针。ANSI C 将细节留给各个实现;此实现将 %p 与 %U 完全相同地处理。对应的 arg:(void **arg)。
可以用方括号括起来的字符模式代替 s 类型字符。pattern 是一组字符,它定义了构成 scanf 输入字段的可能字符的搜索集。如果方括号中的第一个字符是脱字符 (^),则搜索集将被反转,以包括方括号之间除指定字符之外的所有 ASCII 字符。还有一个范围功能,您可以将其用作快捷方式。%[0-9] 匹配所有十进制数字。连字符不能是集合中的第一个或最后一个字符。连字符前面的字符在词法上必须小于连字符后面的字符。以下是一些模式示例:%[abcd] 匹配仅包含 a、b、c 和 d 的字符串。%[^abcd] 匹配包含除 a、b、c 或 d 之外的任何字符的字符串 %[A-DW-Z] 匹配包含 A、B、C、D、W、X、Y、Z 的字符串 %[z-a] 匹配字符 z、- 和 a