以下信息适用于函数的所有 scanf 系列,包括 scanf_s等安全版本。
type 字符是唯一必需的格式字段;它显示在任何可选格式字段的后面。 type 字符决定了关联的自变量是解释为字符、字符串还是数字。
scanf 函数的 type 字符
| 字符 | 预期输入类型 | 参数类型 | 安全版本中的大小参数? |
|---|---|---|---|
c |
字符。 与 scanf 函数结合使用时,指定单字节字符;与 wscanf 函数结合使用时,指定宽字符。 指定了 c 时,也会读取通常被跳过的空白字符。 与其他类型字段不同,字段宽度说明符指示确切的字符数,而不是最大值。 若要读取下一个非空白单字节字符,请使用 %1s;若要读取下一个非空白宽字符,请使用 %1ws。 |
与 char 函数结合使用时,指针指向 scanf ;与 wchar_t 函数结合使用时,指针指向 wscanf 。 |
必需。 大小不包括 null 终止符的空间。 |
C |
相反大小字符。 与 scanf 函数结合使用时,指定宽字符;与 wscanf 函数结合使用时,指定单字节字符。 指定了 C 时,也会读取通常被跳过的空白字符。 与其他类型字段不同,字段宽度说明符指示确切的字符数,而不是最大值。 若要读取下一个非空白单字节字符,请使用 %1s;若要读取下一个非空白宽字符,请使用 %1ws。 |
与 wchar_t 函数结合使用时,指针指向 scanf ;与 char 函数结合使用时,指针指向 wscanf 。 |
必需。 大小自变量不包括 null 终止符的占用空间。 |
d |
十进制整数。 | 指向 int的指针。 |
不是。 |
i |
{1}一个整数。{2} 如果输入字符串以“0x”或“0X”开始,则为十六进制;如果字符串以“0”开始,则为八进制;其余情况为十进制。 | 指向 int的指针。 |
不是。 |
o |
八进制整数。 | 指向 int的指针。 |
不是。 |
p |
十六进制数字中的指针地址。 最大位数读数取决于指针大小(32 位或 64 位),指针大小取决于计算机体系结构。 接受“0x”或“0X”作为前缀。 | 指向 void*的指针。 |
不是。 |
u |
无符号十进制整数。 | 指向 unsigned int的指针。 |
不是。 |
x |
十六进制整数。 | 指向 int的指针。 |
不是。 |
| 包含可选符号(+ 或 -)的浮点值、包含小数点的一个或多个十进制数字系列,以及后跟可选带符号整数值的可选指数(“e”或“E”)。 | 指向 float的指针。 |
不是。 | |
| %> | 由一系列一个或多个包含可选小数点的十六进制数字和后跟十进制值的一个指数(“p”或“P”)所组成的浮点值。 | 指向 float的指针。 |
不是。 |
n |
未从流或缓冲区读取任何输入。 | 指向 int的指针,其中存储了当前调用 scanf 函数或 wscanf 函数时从流或缓冲区到该点成功读取的字符数。 |
不是。 |
s |
字符串,直到第一个空白字符(空格、制表符或换行)。 若要读取未被空格字符分隔的字符串,请使用一组方括号 ([ ]),如 scanf 宽度规范中所述。 |
与 scanf 函数结合使用时,表示单字节字符数组;与 wscanf 函数结合使用时,表示宽字符数组。 无论哪种情况,字符数组都必须具有足够大小以容纳输入字段和自动附加的终止 null 字符。 |
必需。 大小中包括 null 终止符的占用空间。 |
S |
相反大小字符字符串,直到第一个空白字符(空格、制表符或换行)。 若要读取未被空格字符分隔的字符串,请使用一组方括号 ([ ]),如 scanf 宽度规范中所述。 |
与 scanf 函数结合使用时,表示宽字符数组;与 wscanf 函数结合使用时,表示单字节字符数组。 无论哪种情况,字符数组都必须具有足够大小以容纳输入字段和自动附加的终止 null 字符。 |
必需。 大小中包括 null 终止符的占用空间。 |
大小自变量(如有必要)应紧跟在其适用于的自变量之后传递到参数列表中。 例如,以下代码:
char string1[11], string2[9];
scanf_s("%10s %8s", string1, 11, string2, 9);
将最大长度为 10 的字符串读入 string1,并将最大长度为 8 的字符串读入 string2。 缓冲区大小应至少比宽度规范多一个,因为必须为 null 终止符保留空间。
无论是使用函数的单字节字符版本还是宽字符版本,格式字符串都可以处理单字节或宽字符输入。 因此,若要读取包含 scanf 函数和 wscanf 函数的单字节字符或宽字符,请按如下所述使用格式说明符。
| 若要将字符读取为 | 使用此函数 | 使用这些格式说明符 |
|---|---|---|
| 单字节 | scanf 函数 |
c、hc 或 hC |
| 单字节 | wscanf 函数 |
C、hc 或 hC |
| 宽 | wscanf 函数 |
c、lc 或 lC |
| 宽 | scanf 函数 |
C、lc 或 lC |
若要扫描包含 scanf 函数和 wscanf 函数的字符串,请将上表与格式类型说明符 s 和 S 结合使用,而不是与 c 和 C一起使用。