Должен ли %% пропускать начальные пробелы в scanf? - PullRequest
0 голосов
/ 08 ноября 2018

Согласно спецификации fscanf в С17 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);
}

1 Ответ

0 голосов
/ 08 ноября 2018

Следует пропустить пробел.

В спецификации есть пример, который говорит, что пробел должен быть пропущен:

ПРИМЕР 5 Звонок:

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

присвоит n значение 1 и i значение 42, поскольку входные пробельные символы пропускаются для обоих спецификаторы преобразования % и d.

...