Использование scanf с регулярными выражениями

Я пытался использовать регулярные выражения в scanf, чтобы прочитать строку максимальных N символов и отбросить все остальное до Нового символа строки. Любые пробелы следует рассматривать как обычные символы, таким образом, включенные в строку для чтения. Я изучил статью Википедии о регулярных выражениях, но я не могу заставить scanf работать должным образом. Вот какой код я пробовал:

scanf("[ ]*%ns[ ]*[n]", string);

[] должен идти для фактического символа пространства, * должен означать один или несколько, n-количество символов для чтения, а строка-указатель, выделенный с помощью malloc. Я пробовал несколько разных комбинаций; однако я склонен читать только первое слово предложения (останавливается на символе пробела). Кроме того,*, похоже, отбрасывает символ вместо значения "ноль или больше"...

может ли кто-нибудь подробно объяснить, как регулярные выражения интерпретируются scanf? Более того, эффективно ли использовать getc повторно вместо?

спасибо!

3 ответов


короткий ответ: scanf не обрабатывает регулярные выражения буквально.

если вы хотите использовать регулярные выражения в C,вы можете использовать библиотеку POSIX регулярных выражений. См. следующий вопрос для основного примера использования этой библиотеки:регулярные выражения в C: примеры?

теперь, если вы хотите сделать это scanf Как вы можете попробовать что-то вроде

scanf("%*[ ]%ns%*[ ]\n",str);

заменить n на %ns по максимальному количеству символов для чтения из входного потока. The %*[ ] часть просит игнорировать любые пробелы. Вы можете заменить * по определенному числу, чтобы игнорировать точное количество символов. Вы можете добавить другие символы между скобками, чтобы игнорировать больше, чем просто пространство.

не уверен, что вышеупомянутый scanf будет работать, поскольку пробелы также соответствуют


эффективно ли использовать getc повторяющимся образом?

зависит несколько от приложения, но да, на неоднократные getc() эффективно.


Если я не прочитал вопрос неправильно, %[^'\n'] S сохранит все, пока не будет обнаружен возврат каретки.