在下面,如果我用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;
}
答案 0 :(得分:4)
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>
这正是我们所需要的,而这正是您在代码中所拥有的。
答案 1 :(得分:2)
这里有两件事情。
第一个是%d
说明符将“修剪”导致十进制数的空格,这就是为什么(space)4
被解析为与4
相同的原因(没有前导)空间)。
第二个是如果你在格式字符串中放置空格,它将“吃掉”任意数量的空白字符(包括零)。
空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格,换行符和制表符 - 请参阅isspace)。格式字符串中的单个空格验证从流中提取的任何数量的空白字符(包括无)。
因此,/
之前格式字符串中的空格将允许您将字符串与分隔空格(例如4 /x
)和不匹配(例如4/x
)匹配。