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 将尝试读取整个标记为字符串。 如果指定的大小不足以容纳整个标记,则对目标字符串不会写入。 如果 宽度 字段指定,则该标记的第一个字符 宽度 到目标字符串将编写与 null 结束符。
范围标题
选项标题 h、 l、 ll、 I64和 L 指示 argument 范围 (长或短,单字节字符或宽字符,该图按照修改的类型) 字符。 如下表所示,这些格式规范字符用于类型字符。 scanf 或 wscanf 功能指定参数的解释。 该类型标题 I64 是 Microsoft 扩展并不兼容的 ANSI。 类型字符及其含义。 scanf “类型字符介绍函数”。 scanf类型字段字符的表。
备注
h、 l和 L 标题是 Microsoft 扩展,则使用类型 char数据。
调整 scanf 和 wscanf 类型的格式说明符的标题
指定属性 |
使用前缀 |
类型说明符 |
---|---|---|
double |
l |
e、 E、 f、 g或 G |
长的二进制文件 (和 double 相同) |
L |
e、 E、 f、 g或 G |
长的 int |
l |
d、 我、 o、 x或 x |
长 unsigned int |
l |
u |
长时间 |
ll |
d、 我、 o、 x或 x |
short int |
h |
d、 我、 o、 x或 x |
短 unsigned int |
h |
u |
int64 |
I64 |
d、 我、 o、 u、 x或 x |
与 scanf的单字节字符 |
h |
c 或 C |
与 wscanf的单字节字符 |
h |
c 或 C |
与 scanf的宽字符 |
l |
c 或 C |
与 wscanf的宽字符 |
l |
c或 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 "),请使用规范 %ncn 是一个十进制整数的位置。 在这种情况下, c 类型字符指示该参数是指向字符数组。 下 n 字符输入流读取到指定的位置,因此, null 字符 (“\ 0 ") 不是追加。 如果 n 未指定,其默认值为 1。
当 scanf 停止读取字段
scanf 功能浏览各输入字段,逐字符。 ,它会出于多种原因之前,到达空格它可以停止读取特定输入字段:
所指定的宽度已到达。
下一个字符不能转换为指定。
下一个字符相冲突。在应匹配的控制字符串中的字符。
下一个字符不能出现在给定字符集。
无论出于什么原因,那么,当 scanf 功能停止读取输入字段时,下输入字段考虑开始在第一个未阅读的字符。 冲突的字符,因此,如果有一个,则将其视为未读并且是下输入字段的第一个字符或在后续的读取操作的第一个字符在输入流。
请参见
参考
scanf, _scanf_l, wscanf, _wscanf_l