sscanf c identifiers regexp

Тема в разделе "WASM.BEGINNERS", создана пользователем Dukales, 24 мар 2010.

  1. Dukales

    Dukales New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2009
    Сообщения:
    199
    Вот регулярное выражение для идентификатора C "[_A-Za-z][_A-Za-z0-9]*". Хотел создать предикат с использованием sscanf:
    Код (Text):
    1. bool is_c_ident(const char * expr, unsigned & offset)
    2. {
    3.  size_t n;
    4.  if (sscanf(expr + offset, "%*1[_a-z]%*[0-9_a-z]%n", &n) == 0)
    5.  {
    6.   offset += n;
    7.  
    8.   return true;
    9.  }
    10.  else
    11.  {
    12.   return false;
    13.  }
    14. }
    , но функция не работает, как хотелось бы. Во-первых, если давать правильный идентификатор:
    Код (Text):
    1. unsigned offset = 0;
    2.  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?
     
  2. 008888

    008888 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2008
    Сообщения:
    17
    isalnum() + спец символы некоторые... а про sscanf попробуй в другом компиляторе билдер С++ это уже давно не си++.