在c中解析,扫描数字时失败

在c中解析,扫描数字时失败,c,string,parsing,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 || e

这里是代码:

#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;
}
问题是: 为什么第二次解析不能正常工作?是否有故障


有人吗?

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

问题在于行
数据+
。一次向前移动一个字符,因此对于第一个字符串,
aku:makan:ati
,由于
,您将在
*数据==k[0]
之前移动
a
k
,解析停止。这是三次移动,导致三个字段被解析
aku
makan
ati

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

首先需要做的是用适当增加
数据
指针的内容替换
数据+++
。下一步,你必须确保你不会离开绳子

为了使这一切更简单,我建议您将
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;
  }
}
void解析(字符*数据,字符拆分)
{
字符格式[8]={0};
字符标记[256];
char*end=data+strlen(数据);
sprintf(格式,“%[^%c]%c”,拆分,拆分);
而(sscanf(数据、格式和令牌)==1&&data
我相信这是一个使用现代调试器很容易解决的问题。你刚才说的“现代调试器”是什么?我是Visual studio 2010附近的n00b或者其他什么,你可以下载一个免费版本(称为Express)。它有一个调试选项。不幸的是,我在unix上。。。。你知道我应该在这些大气中使用什么吗?@capede:GDB。它应该与GCC捆绑在一起。先生,一旦将data++替换为另一个增量指针,我这里就有困难了,您能至少给出代码示例吗?
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;
  }
}