Variadic Scanf в C - PullRequest
       22

Variadic Scanf в C

0 голосов
/ 03 августа 2011

Мне было любопытно, можно ли реализовать разновидность вариационной версии scanf на C. Что я имею в виду, если ввод push (1 2 3), scanf сможет проанализировать это в %s %d %d %d как scanf("%s (%d)", string, some_list).

Это займет все экземпляры %d и добавит их (по порядку) в список ...

Разве я говорю смысл?

РЕДАКТИРОВАТЬ: Для указанного ввода, string == "push" и some_list == [1, 2, 3].

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Разве vscanf, vssscanf, vsfcanf не то, что вы ищете? Они доступны начиная с C99.

Вот описание и пример использования функции vscanf . Обратите внимание, что C - это скомпилированный и строго типизированный язык, вам нужно правильно указать спецификаторы формата. Выполнение чего-то вроде того, что для более высоких языков, потребует больше работы (но это возможно, потому что функции написаны на языке Inturn).

0 голосов
/ 03 августа 2011

Конечно.Вы могли бы реализовать версию scanf, которая работала бы так:

Причина, по которой она не является частью библиотеки C, заключается в том, что ей потребуются структуры данных, которые не встроены в библиотеку.Например, связанный список или массив с изменяемым размером.

Но в любом случае вы можете создать функцию scanf, которая принимает расширенную форму шаблонов.Это может выглядеть как super_scanf("%{s:allocate} (%{d*:array,append)", &string, &array)

Но обычно вы либо пишете свой собственный токенизатор и простой парсер, либо переходите к чему-то более мощному, например, к lex / yacc.Или вы можете использовать библиотеку регулярных выражений, например, библиотеку PCRE.

...