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

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

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

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

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

Заранее спасибо

3 ответа

Решение

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

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

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

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

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

Не уверен, что вышеуказанный scanf будет работать, так как пробелы также совпадают с %s директивы.
Я бы определенно пошел с fgets вызовите, затем обрежьте окружающие пробелы примерно следующим образом: Как мне обрезать начальные / конечные пробелы стандартным способом?

вместо этого эффективно использовать getc?

Отчасти зависит от приложения, но ДА, повторяется getc() является эффективным.

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

Другие вопросы по тегам