Scanf без дополнительных аргументов в C

Разрешено ли использовать scanf(" ") без дополнительных аргументов, чтобы игнорировать начальные пробелы?
Я использую getchar() для чтения символов слова, и я хочу игнорировать пробелы перед словом (пробелы после использования для проверки конца слова).
Код следующий: правильно ли это?

char *read_word() {
    int size = 2;
    int char_count = 0;
    char *s;
    char ch;

    s = mem_alloc(size);

    scanf(" ");

    while ((ch = getchar()) != EOF) {
        if (char_count >= size) {
            s = mem_realloc(s, size++);
        }

        if (ch == ' ' || ch == '\n') {
            s[char_count] = '\0';
            break;
        }

        s[char_count++] = ch;
    }

    return s;
}

Ответ 1

Из определения функции scanf() (*) подчеркиваем мою:

Формат состоит из директив ноль или более: один или несколько символов пробела, обычный многобайтовый символ (ни %, ни символ пробела), или спецификация преобразования.

[...]

Директива, состоящая из символа (ов) белого пробела, выполняется путем считывания ввода до первого символа небелого пробела (который остается непрочитанным) или до тех пор, пока не будет прочитано больше символов.

Итак, scanf( " " ); отлично действует.


(*): ISO/IEC 9899: 1999, 7.19.6.2 Функция fscanf, раздел 3 и 5.

Другие функции *scanf определены в терминах этого раздела.

Ответ 2

Чтобы добавить к другим ответам, все из следующих утверждений:

scanf(" ");      // skip over whitespace
scanf("xyz");    // skip over the longest leading substring of "xyz" if present
                 // i.e. "xyz" or "xy" or "x"
scanf(" %*s ");  // skip over the first string and whitespace around it

Ответ 3

manpage говорит:

Строка формата состоит из последовательности директив

...

Директива является одной из следующих:

• Последовательность символов пробела (пробел, табуляция, символ новой строки и т.д. см. isspace (3)). Эта директива соответствует любому количеству пробелов, в том числе нет, на входе.

...

так да, это законное использование scanf.


Если вы после эффективности:

int c;
while(isspace(c=getchar()) {;}

приводит к более эффективному пути, как getchar et. и др. имеют тенденцию иметь _unlocked аналогов, в отличие от scanf.

Ответ 4

Вместо этого я попробую:

int skip = -1;
if (scanf(" %n", &skip)>=0 && skip>0)   {
  // you have skipped skip spaces
}

Тест >= 0 проверяет, что scanf не сработал (например, из-за EOF на stdin или ошибки ввода). Тест skip>0 проверяет, что мы пропустили хотя бы один пробельный байт. Спецификатор преобразования %n дает количество проанализированных байтов.