Если строки, которые должны быть сопоставлены, могут быть заблокированы во время компиляции, вам следует рассмотреть возможность использования генератора токенизатора, например lex , для сканирования вашего ввода на совпадения. Если вы не знакомы с ним, lex берет исходный файл, который имеет некоторые регулярные выражения (включая самые простые регулярные выражения - строковые литералы) и код действия C, который будет выполняться при обнаружении совпадения. Он часто используется при сборке компиляторов и подобных программ, и есть несколько других подобных программ, которые вы также можете использовать (на ум приходят flex и antlr). lex создает таблицы конечных автоматов, а затем генерирует эффективный код C для сопоставления ввода с регулярными выражениями, которые представляют эти таблицы состояний (по умолчанию ввод является стандартным вводом, но вы можете изменить это). Использование этого метода, вероятно, не приведет к дублированию строк (или других данных) в памяти между различными экземплярами вашей программы, которых вы боитесь. Вероятно, вы могли бы легко сгенерировать регулярные выражения из строковых литералов в вашем существующем коде, но может потребоваться немало усилий, чтобы переработать вашу программу, чтобы использовать код, который lex генерировал.
Если строки, которым вы должны соответствовать, меняются со временем, есть некоторые библиотеки регулярных выражений, которые могут компилировать регулярные выражения во время выполнения, но они действительно используют много оперативной памяти, и в зависимости от архитектуры вашей программы они могут дублироваться в разных экземплярах программа.
Самое замечательное в использовании подхода регулярных выражений, а не большого количества вызовов strcmp
, заключается в том, что если у вас есть шаблоны:
"string1"
"string2"
"string3"
и ввод:
"string2"
Частичное совпадение для «строки» будет выполнено только один раз для системы регулярных выражений DFA (детерминированный конечный автомат) (например, lex ), которая, вероятно, ускорит вашу систему. Создание этих вещей требует большой работы от имени lex , но вся тяжелая работа выполняется заранее.