我正在尝试解析一个类似于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返回了一个错误的Here,我试过使用strchr,它也返回了batptr。知道为什么它会返回badptr吗?
仅供参考,之前我试过了:
tok = strchr(dupstring, ",");它在一段时间内工作得很好,并开始返回badptr。我不确定它为什么要这么做。
发布于 2013-06-01 00:39:37
正如前面已经指出的,您向strchr和memchr传递了错误的参数。第二个参数是保存字符值的整数,而不是const char *。
这一行
rangeTok = (char *)memchr(tok, "-", strlen(tok));应该是
rangeTok = (char *)memchr(tok, '-', strlen(tok));或者最好是
rangeTok = strchr(tok, '-');顺便说一句,这是什么badptr?你是说NULL吗?
发布于 2013-06-01 00:03:09
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()需要一个字符串作为第一个参数,其第一个字符用作扫描令牌的起始位置。在随后的调用中,该函数期望一个空指针,并使用紧接在最后一个令牌结束之后的位置作为新的扫描开始位置。
发布于 2013-06-01 00:08:51
尝试以这种方式使用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;
}
}https://stackoverflow.com/questions/16861393
复制相似问题