M.M*_*M.M 4 c scanf language-lawyer
根据fscanfC17 7.21.6.2/8中的规范:
输入的空白字符(由指定的
isspace功能)被跳过,除非本说明书包括一个[,c或n符
如果格式字符串包含%%,则它是具有说明%符的规范.那不是[,c或者n,所以标准似乎说这里应该跳过前导空格.
我的问题是:这是正确的解释,还是标准中的缺陷?
我测试了两种不同的实现(mingw-w64与MSVCRT stdio,mingw-w64与MinGW stdio).前者没有跳过领先的空白,后者则没有.
测试代码:
#include <stdio.h>
int main(void)
{
int a, r;
// Should be 1 according to standard; would be 0 if %% does not skip whitespace
r = sscanf("x %1", "x%% %d", &a);
printf("%d\n", r);
// Should always be 1
r = sscanf("x%1", "x%% %d", &a);
printf("%d\n", r);
}
Run Code Online (Sandbox Code Playgroud)
它应该跳过空格.
该规范有一个例子,具体说明应该跳过空格:
例5电话:
Run Code Online (Sandbox Code Playgroud)#include <stdio.h> /* ... */ int n, i; n = sscanf("foo %bar 42", "foo%%bar%d", &i);将分配给
n值1和i值,42因为对于%和d转换说明符都会跳过输入的空格字符.