scanf 宽度规范
此信息适用于 scanf 系列函数的格式字符串的解释,如包括安全版本 scanf_s。 这些函数通常假设内容分为标记的序列。 标记分隔空格 (空格、制表符、换行符),或者对于数值类型,由数值数据类型的结束。表示自然的由无法转换为的数值文本的第一个字符。 但是,指定宽度能用于使分析输入的自然结束标记之前停止。
规范 宽度 在 % 字段和类型说明符之间的字符,可以包括调用标记字段 宽度 字段的大小和一个或多个字符的正整数,也可以视为字段类型修饰符,如表示整数类型是 short 或 long。 这样的字符范围称为前缀。
宽度字段
宽度 字段是控件字符的最大正值十进制整数将读取为该字段。 不多于 宽度 的字符转换并存储在对应的 argument。 小于 宽度 的字符,如果能读取不能根据特定的格式转换的空白字符 (空格、制表符、换行符) 或字符时,宽度 在达到之前。
宽度规范从安全版本需要的缓冲区大小参数是个不同的这些函数 (例如,scanf_s、wscanf_s等)。在下面的示例中,指定宽度是 20,它表明 20 字符将输入流读取。 缓冲区长度为 21 个字符,包括可能的字符 20 和 Null 结束符的空间:
char str[21];
scanf_s("%20s", str, 21);
如果没有使用 宽度 字段,scanf_s 将尝试读取整个标记为字符串。 如果指定的大小不足以容纳整个,标记将不会写入目标字符串。 如果 width 字段指定,则标记中的第一 宽度 的字符会写入目标字符串和 Null 结束符。
前缀大小
选项前缀 h、l、ll、I64和 L。指示 argument 的大小为 (的 long 或 short,单字节字符或字符宽,可能对其进行修改) 的类型的字符。 如下表所示,这些格式规范字符用于类型字符在 scanf 或 wscanf 函数时指定参数的解释。 类型 I64 前缀是 Microsoft 扩展不兼容的 ANSI。 类型字符及其含义在 scanf 类型字段字符“scanf 函数的类型字符”表中描述。
备注
h、l及 L 前缀是 Microsoft 扩展,但在用于 char类型的数据。
大小和 wscanf scanf 格式类型说明符的前缀
指定属性 |
使用前缀 |
类型说明符 |
---|---|---|
double |
l |
e、E、f、g或 G |
long double (和 Double 相同) |
L |
e、E、f、g或 G |
long int |
l |
d、i、o、x或 X |
long unsigned int |
l |
u |
long long |
ll |
d、i、o、x或 X |
short int |
h |
d、i、o、x或 X |
short unsigned int |
h |
u |
__int64 |
I64 |
d, i, o, u, x, or X |
单字节字符集scanf |
h |
c or C |
单字节字符集wscanf |
h |
c or C |
宽字符scanf |
l |
c or C |
宽字符wscanf |
l |
c, or C |
单字节 - 具有 scanf的字符串 |
h |
s 或 S |
单字节 - 具有 wscanf的字符串 |
h |
s 或 S |
使用 scanf的字符串 |
l |
s 或 S |
使用 wscanf的字符串 |
l |
s 或 S |
使用 scanf_s 函数和 wscanf_s 函数的示例使用 h 并 l :
scanf_s( "%ls", &x, 2 ); // Read a wide-character string
wscanf_s( "%hC",&x, 2 ); // Read a single-byte character
如果使用一 unsecure 函数在 scanf 系列,请省略指示前面的参数的缓冲区长度的大小参数。
读取 Undelimited 字符串
若要将空白字符未分隔的字符串,在一组方括号 ([ ]) 后的字符可以替换 s (字符串) 类型字符被重写。 集的字符在括号称为控件字符串。 对应的输入字段读取多不显示控件字符串第一个字符。 如果集合中的第一个字符是插入符号 (^),则效果反转:输入字段读取最多显示字符集的第一个字符。
注意 %[a-z] 和 %[z-a] 时解释为对 **%[abcde...z]**的等效。 这是常见函数扩展 scanf,不过,请注意,ANSI 标准不需要它。
读取未终止的递归字符串
若要存储字符串,而存储一终止 null 字符 (“\ 0 "),请使用 %nc 规范 n 是十进制整数的位置。 在此例中,c 类型字符指示参数是指向字符数组。 下 一 字符输入流读取到指定位置,并且,null 字符 (“\ 0 ") 不追加。 n 如果未指定,则默认值是 1。
在停止读取字段 scanf
scanf 函数会扫描每个输入字段,由字符的字符。 则会由于多种原因,空格字符之前到达它会停止读取特定输入字段:
指定的宽度已到达。
下字符无法转换为指定。
用字符的字符下一次放置在控件字符串应匹配。
下一个字符不能出现特定字符集。
无论出于什么原因,在停止读取输入域,scanf 函数时,请考虑下输入范围开始第未读取字符。 矛盾的字符,因此,如果具有一个,则将其视为未读并且是下输入字段的第一个字符转换或在后续的读取操作的第一个字符对内容。
请参见
参考
scanf、_scanf_l、wscanf、_wscanf_l