Вот регулярное выражение для идентификатора C "[_A-Za-z][_A-Za-z0-9]*". Хотел создать предикат с использованием sscanf: Код (Text): bool is_c_ident(const char * expr, unsigned & offset) { size_t n; if (sscanf(expr + offset, "%*1[_a-z]%*[0-9_a-z]%n", &n) == 0) { offset += n; return true; } else { return false; } } , но функция не работает, как хотелось бы. Во-первых, если давать правильный идентификатор: Код (Text): unsigned offset = 0; is_c_ident("a1a2a3", offset); , то выдаёт false, т.к. sscanf == -1. Исправляется это включением любого символа не из [_a-z] и [0-9_a-z] перед '\0', то есть строка становится такой например — "a1a2a3 ". Во-вторых она вообще выдаёт true для строки "1a2a3a\n", так как sscanf не уменьшает свой result если не встречается строки, удовлетворяющей очередному search set с assignment-suppression charicter, то есть здесь "%*1[_a-z]". Компилятор — Borland C++ Builder 6.0. Стоит ли заменить это посимвольным анализом? Или возможно обойтись sscanf?
isalnum() + спец символы некоторые... а про sscanf попробуй в другом компиляторе билдер С++ это уже давно не си++.