%%是否应跳过scanf中的前导空格?

M.M*_*M.M 4 c scanf language-lawyer

根据fscanfC17 7.21.6.2/8中的规范:

输入的空白字符(由指定的isspace功能)被跳过,除非本说明书包括一个[,cn

如果格式字符串包含%%,则它是具有说明%符的规范.那不是[,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)

Bar*_*mar 6

它应该跳过空格.

该规范有一个例子,具体说明应该跳过空格:

例5电话:

#include <stdio.h>
/* ... */
int n, i;
n = sscanf("foo %bar 42", "foo%%bar%d", &i);
Run Code Online (Sandbox Code Playgroud)

将分配给n1i值,42因为对于%d转换说明符都会跳过输入的空格字符.