1

我正在尝试解析格式字符串,例如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,我尝试使用strchrwhich is also returned batptr。任何想法为什么它会返回badptr

仅供参考,我之前尝试过:

tok = strchr(dupstring, ",");

它工作了一段时间,并开始返回badptr。我不确定它为什么这样做。

4

3 回答 3

1

正如已经指出的那样,您将错误的参数传递给strchrand 。memchr第二个参数是一个包含字符值的整数,而不是a const char *

这条线

rangeTok = (char *)memchr(tok, "-", strlen(tok));

应该是

rangeTok = (char *)memchr(tok, '-', strlen(tok));

或者最好

rangeTok = strchr(tok, '-');

顺便说一句,这是什么badptr?你的意思是NULL

于 2013-05-31T16:39:36.870 回答
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;
    }
}
于 2013-05-31T16:08:50.760 回答
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()需要一个字符串作为第一个参数,其第一个字符用作扫描标记的起始位置。在随后的调用中,该函数需要一个空指针,并使用最后一个标记结束后的位置作为新的扫描起始位置。

于 2013-05-31T16:03:08.887 回答