strchr,memchr无法找到角色

时间:2013-05-31 15:58:37

标签: c++ c

我正在尝试解析像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。我不确定为什么这样做。

3 个答案:

答案 0 :(得分:2)

您正在向strchrmemchr传递错误的参数,正如已经指出的那样。第二个参数是一个保存字符值的整数,一个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;
    }
}