构建由冒号分隔的数据?

时间:2015-10-10 18:13:11

标签: c

我的数据如下:

protocolAction:dataA:dataB 

然后我需要获取标题(protoclAction)和2个数据字段。

我这样做 - 并告诉它不是线程安全且不健康:

//data is global
char incomingData[200] = {0};

                 char *header = strtok (incomingData,":");
                 char *dataA=strtok (NULL, ":");
                 char *dataB=strtok (NULL, ":");

我最好但又简单的选择是提取字段而不是此代码?

2 个答案:

答案 0 :(得分:4)

“不健康”?它不是线程安全的,通常不是一个问题。如果 是一个问题并且您在POSIX系统上,请改用strtok_r()。如果您不在POSIX上,请提供您自己的strtok_r()

总的来说,这是我自己的strtok()实现(对于某些DOS编程需要它):

static int _isinstr(const char c, const char *str)
{
    while (*str)
    {
        if (c == *str) return 1;
        ++str;
    }
    return 0;
}

char *strtok(char *str, const char *delim)
{
    static char *strtokptr = 0;
    char *p;
    int t = 0;

    if (!str) str = strtokptr;
    if (!str) return 0;

    p = str;
    while (*p)
    {
        if (_isinstr(*p, delim))
        {
            if (!t) goto cont;
            *p = 0;
            strtokptr = p+1;
            return str;
        }
        if (!t)
        {
            t = 1;
            str = p;
        }
cont:
        ++p;
    }
    if (t && p > str)
    {
        strtokptr = 0;
        return str;
    }
    return 0;
}

strtok_r()所要做的就是删除静态strtokptr,而是添加一个参数char **strtokptr,并在所使用的strtoktpr处添加额外的解除引用。

答案 1 :(得分:1)

作为替代方案,您可以使用sscanf -

  /* Allocate memory to pointers  header ,dataA ,dataB  */
  /*assuming data is in incomingdata and it is null terminated */

  if(sscanf(incomingData,"%[^:]:%[^:]:%s",header,dataA,dataB)==3){
      // do something with these variables
   }