这里的代码:
#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
$
问题是: 为什么第二次解析不能正常工作?,有任何错误吗?
任何人?
答案 0 :(得分:1)
问题是行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;
}
}
答案 1 :(得分:0)
在regex_sym_pos
中,你有时会返回一个整数,有时只是返回。这是一件非常糟糕的事情,我认为如果您启用所有警告并注意它们,编译器应该告诉您。