在下面,如果我scanf
用%d /%d"
(带空格)写,那么我可以输入一个由空格分隔的分数。
例如:输入可以是5/7
或5 /7
或 5 / 7
(任何地方都有空格)。
下面代码中的 scanf 如何以这种方式读取数字之间的空格,但它之间只有一个空格%d /%d"
?
#include <stdio.h>
int main()
{
int i, j;
scanf("%d /%d", &i, &j);
return 0;
}
几乎所有输入格式说明scanf
符都会在读取实际数据之前自动跳过所有空格。例如,%d
格式说明符scanf
实际上意味着<skip spaces> <read int>
.
这意味着如果我们使用%d/%d
格式来读取分数,它将代表
<skip spaces> <read int> <require /> <skip spaces> <read int>
在这个序列中,我们拥有一切必要的东西,除了我们不允许/跳过/
. 为了解决这个问题,我们必须在 之前添加一个跳过空格的显式请求/
,它在scanf
格式字符串中由空格字符表示。/
在生成格式字符串之前添加一个空格字符%d /%d
,它代表
<skip spaces> <read int> <skip spaces> <require /> <skip spaces> <read int>
这正是我们所需要的,这正是您在代码中所拥有的。
这里有两件事。
第一个是说明%d
符将“修剪”导致十进制数的空格,这就是为什么(space)4
解析与简单4
(没有前导空格)相同的原因。
第二个是如果您在格式字符串中放置空格,它将“吃掉”任意数量的空格字符(包括零)。
空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——参见 isspace)。格式字符串中的单个空格验证从流中提取的任意数量的空格字符(包括无)。
因此,您在格式字符串中的空格/
将允许您匹配带有分隔空格(例如4 /x
)和不带空格(例如)的字符串4/x
。