1

在下面,如果我scanf%d /%d"(带空格)写,那么我可以输入一个由空格分隔的分数。

例如:输入可以是5/75 /75 / 7(任何地方都有空格)。

下面代码中的 scanf 如何以这种方式读取数字之间的空格,但它之间只有一个空格%d /%d"

#include <stdio.h>

int main()
{
   int i, j;
   scanf("%d /%d", &i, &j);
   return 0;
}
4

2 回答 2

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>

这正是我们所需要的,这正是您在代码中所拥有的。

于 2012-11-26T23:20:33.947 回答
2

这里有两件事。

第一个是说明%d符将“修剪”导致十进制数的空格,这就是为什么(space)4解析与简单4(没有前导空格)相同的原因。

第二个是如果您在格式字符串中放置空格,它将“吃掉”任意数量的空格字符(包括零)。

空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——参见 isspace)。格式字符串中的单个空格验证从流中提取的任意数量的空格字符(包括无)。

参考

因此,您在格式字符串中的空格/将允许您匹配带有分隔空格(例如4 /x)和不带空格(例如)的字符串4/x

于 2012-11-26T23:12:35.843 回答