在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;
}
}