синтаксический анализ в c, не удалось при сканировании номера - PullRequest
0 голосов
/ 12 марта 2011

вот код:

#include <stdio.h>
#include <string.h>

char *regex_get_string(char *data,unsigned int start_pos, unsigned int end_pos)
{

#define MAX_length_regex_res 256
    static char result[MAX_length_regex_res];

    if(start_pos < 0 || end_pos <= 0 || start_pos > end_pos) return NULL;
    if(start_pos > strlen(data) || end_pos > strlen(data)) return NULL;
    if((end_pos - start_pos + 1) > MAX_length_regex_res) return NULL;

    int i;
    for (i = 0; i <  start_pos ; i++)data++;
    memcpy(result,data,end_pos - start_pos + 1);
    result[end_pos - start_pos] = 0;

    return result;
}

int regex_symb_pos(char *data,char *symb,unsigned int start_pos)
{

    if(start_pos >= strlen(data) || start_pos < 0)return -1;
    unsigned int i;
    for(i = start_pos; i <= strlen(data); i++)
    {
        if(data[i] == symb[0])return i;
        if(i == strlen(data)) return;
    }

    return;
}

 void parse(char *data, int split)
{
     char k[2],*p;

     k[0] = split;
        k[1] = 0;
     int pos_now;
     int new_start_pos = 0;


         while(*data != split)
         {
     //        if(*data == '\0')return;

             pos_now = regex_symb_pos(data,k,new_start_pos);
             p = regex_get_string(data,(new_start_pos == 1 ? 0 : new_start_pos),pos_now);

             new_start_pos = pos_now;
             printf("nilai new_start_pos : %d\n",new_start_pos);
            printf("data : %s\n",p);
            data++;
          }

}

int main(int argc, char *argv[])
{

    parse("aku:makan:ati",':'); // first parsing
    printf("\n-------------------\n");
    parse("2:capede:eke:bo",':'); // second parsing

    return 0;
}

выход:

$ ./pointer_parsenilai 
new_start_pos : 3
data : aku
nilai new_start_pos : 8
data : makan
nilai new_start_pos : 11
data : ati

-------------------
nilai new_start_pos : 1
data : 2
$

и вопрос: как получается, что второй разбор не работает должным образом?

кто-нибудь?

Ответы [ 2 ]

1 голос
/ 12 марта 2011

Проблема в линии data++.Вы продвигаетесь вперед на один символ за раз, поэтому для вашей первой строки, aku:makan:ati, вы проходите мимо a, k и u до *data == k[0] из-за :, и анализ останавливается.Это случайно три хода, что приводит к анализу трех полей;aku, makan и ati.

Вторая строка, 2:capede:eke:bo, содержит только один символ, 2, до того как вы достигнете :, и синтаксический анализ прекращается.Поэтому разбирается только первое поле.Если вы измените строку на 22:capede:eke:bo, вы увидите, что и 22, и capede анализируются.

Сначала вам нужно заменить data++ на что-то, что увеличиваетdata указатель соответственно.Затем вы должны убедиться, что вы не выходите за пределы строки.

Чтобы все было намного проще, я бы предложил вам заменить функцию parse на что-то вроде этого:

void parse(char *data, char split)
{
  char format[8] = {0};
  char token[256];
  char *end = data + strlen(data);

  sprintf(format, "%%[^%c]%c", split, split);

  while (sscanf(data, format, &token) == 1 && data < end)
  {
    printf("%s\n", token);
    data += strlen(token) + 1;
  }
}
0 голосов
/ 12 марта 2011

В regex_sym_pos вы иногда возвращаете целое число, а иногда просто возвращаете.Это очень плохая вещь, и я думаю, что компилятор должен сказать вам об этом, если вы включите все предупреждения и обратите на них внимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...