在c中解析,扫描号码时失败

时间:2011-03-12 18:02:09

标签: c string parsing

这里的代码:

#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 个答案:

答案 0 :(得分:1)

问题是行data++。您一次向前移动一个字符,因此对于您的第一个字符串aku:makan:ati,您会在a之前移过ku*data == k[0],因为:,解析停止。这是意外的三次移动,导致三个字段被解析; akumakanati

第二个字符串2:capede:eke:bo在到达2之前只有一个字符:,并且解析停止。这就是为什么只解析第一个字段的原因。如果您将字符串更改为22:capede:eke:bo,则会看到22capede都已解析。

首先需要做的是将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;
  }
}

答案 1 :(得分:0)

regex_sym_pos中,你有时会返回一个整数,有时只是返回。这是一件非常糟糕的事情,我认为如果您启用所有警告并注意它们,编译器应该告诉您。