Согласно спецификации fscanf в C17 7.21.6.2/8:
Input white-space characters (as specified by the
isspacefunction) are skipped, unless the specification includes a[,c, ornspecifier
Если строка формата содержит %%, то это спецификация со спецификатором %. Это не [, 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);
}





Он должен пропускать пробелы.
В спецификации есть пример, в котором конкретно говорится, что пробелы следует пропускать:
EXAMPLE 5 The call:
#include <stdio.h> /* ... */ int n, i; n = sscanf("foo %bar 42", "foo%%bar%d", &i);will assign to
nthe value1and toithe value42because input white-space characters are skipped for both the%anddconversion specifiers.
Согласен, это тоже меня удивило. Я был бы менее удивлен, если бы они просто забыли решить эту проблему конкретно, как подозревал ОП.
Хм. Я удивлен; Я бы подумал, что
%%будет указан как совсем не конверсия, а скорее как обозначение буквального символа%. Но это не то, как это делается. (Вероятно, потому, что исходная реализацияscanfбыла небрежной, и всем остальным пришлось скопировать ее для обратной совместимости.)