C语言 使用 scanf 获取小数



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

例如:输入可以是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 中几乎所有输入格式说明符都会在读取实际数据之前自动跳过所有空格。 例如,scanf中的%d格式说明符实际上意味着<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)的字符串。

最新更新