我正在尝试解析像1-3,5-7
这样的格式字符串。我需要阅读1,3和5,7。
我在做什么
char *dup_string;
dup_string = strdup(data);
tok = strtok(dup_string, ",");
while (tok != NULL)
{
char *rangeTok;
rangeTok = (char *)memchr(tok, "-", strlen(tok));
startpage = atoi(tok);
if(rangeTok != NULL)
{
*rangeTok++;
endpage = atoi(rangeTok);
}
else
endpage = startpage;
tok = strtok(NULL,",");
}
此处memchar
返回了badptr,我尝试使用strchr
并返回batptr
。任何有关它返回badptr
的想法。
仅供参考,我曾尝试过:
tok = strchr(dupstring, ",");
在某段时间内工作正常,并开始返回badptr
。我不确定为什么这样做。
答案 0 :(得分:2)
您正在向strchr
和memchr
传递错误的参数,正如已经指出的那样。第二个参数是一个保存字符值的整数,不一个const char *
。
这一行
rangeTok = (char *)memchr(tok, "-", strlen(tok));
应该是
rangeTok = (char *)memchr(tok, '-', strlen(tok));
或者最好
rangeTok = strchr(tok, '-');
顺便说一句,这是什么badptr
?你的意思是NULL
吗?
答案 1 :(得分:1)
memchr()的原型如下,void * memchr(void * ptr, int value, size_t num);
。但是你在memchr(tok, "-", strlen(tok));
而不是整数传递一个字符串。你使用strtok()
的方式也是错误的,应该如下,
tok = strtok(dup_string, ",");
while (tok != NULL)
{
/* Body of Loop */
tok = strtok(NULL,",");
}
在第一次调用时,strtok()
需要一个字符串作为第一个参数,其第一个字符用作扫描标记的起始位置。在后续调用中,函数需要一个空指针,并在最后一个令牌结束后立即使用该位置作为扫描的新起始位置。
答案 2 :(得分:1)
尝试以这种方式使用sscanf()
#include<stdio.h>
#include<string.h>
main()
{
char *data = "1-3,5,8-9";
char *ptr = data;
int e, pos=0, startpage, endpage;
while((e=sscanf(ptr, "%d-%d%n", &startpage, &endpage, &pos))>=1)
{
ptr+=pos;
if(e==1)
endpage = startpage;
printf("start page %d ** end page %d\n",startpage,endpage);
if (sscanf(ptr, " %*[,]%n", &pos) >= 0)
ptr+=pos;
}
}