08.09.2008, 15:24
общий
это ответ
Здравствуйте, Cimus!
да, действительно, Си не поддерживают регулярные выражения, но похоже лишь потому, что он обладает другой техноглогией ввода-вывода: scanf-printf, эта пара функций в общем случае предоставляет более широкий механизм форматирования и поиска (есть разве что один недостаток по отношению к регулярным выражениям: повторный ввод шаблона невозможен)
документация на русском языке сейчас уже не проблема, любой поисковик может предоставить вам множество русскоязычных сайтов-прототипов SDK с полным или частичным описанием функций, достаточно просто ввести название функции в форму поиска (но ориентироваться по структуре смежных API лучше всетаки с оригинала: http://msdn.microsoft.com/)
вот, к примеру, что выдал google:
для scanf: http://www.codenet.ru/progr/cpp/spru/scanf.php
для printf: http://www.codenet.ru/progr/cpp/spru/printf.php
эти функции форматируют ввод-вывод в файлы,
аналогично существует набор функций для ввода-вывода в/из памяти: sscanf-sprintf, но их формат практически не отличается от scanf-printf,
поэтому достаточно изучить только эту пару функций
соответствие шаблону в этом случае можно определять несколькими способами:
1. анализировать результат scanf-sscanf (он равен числу считанных выражений, заданных шаблоном), к примеру: на шаблон "мама мыла %*d рам" результат будет 1, если строка соответствует шаблону, а вот шаблон еще и с ожиданием строки: "мама %*s мыла %*d рам" или "мама %*[^0x20] мыла %*d рам" (соответствие: "мама Зина мыла 5 рам", "мама Наташа мыла 9 рам" и т.п.) здесь уже 2 выражения, следовательно scanf-sscanf вернет 2 в случае успеха.
2. анализировать результат контрольного выражения, например sscanf(src,"мама мыла %*d рам%n",&n) выставит в переменную n номер символа, на котором анализ строки был завершен, так, при этом инициализируя n = -1 можно убедиться в соответствии строки шаблону: если n не изменился, значит строка не подходит, иначе - подходит вплоть до выражения "%n"
3. существует еще один неявный способ: анализ считывающего маркера _ptr в структуре FILE, который после вызова sscanf-sprintf указывает на конец строки, либо на первый символ, не соответствующий шаблону.
PS: выражение "%n" не учитается на возврате из scanf-sscanf, поэтому во втором случае успешный результат будет так же 1, все остальные выражения обязательно учитаются
PS: как мы видим, формат scanf немного похож на регулярные выражения, но на самом деле все с точностью до наоборот: регулярные выражения - урезанный аналог scanf.