如何在一个点上拆分字符串并有效地提取所有字段?

时间:2013-11-26 05:12:10

标签: c++ string split

我正在尝试将实际的key拆分为点,然后在点上分割后提取所有字段。

我的钥匙看起来像这样 -

t26.example.1136580077.colox

目前,在第一个点上分割后,我只能提取第一个t26字段。现在我不知道如何使用下面的代码提取所有其他字段,更像是C.

以下是我目前使用的代码,用于从中提取第一个字段。

if (key)
{
    char* first_dot = strchr(key, '.');
    if (first_dot)
    {
        // cut at the first '.' character
        first_dot[0] = 0;
    }
}

cout << "Fist Key: " << key << endl;

分裂点后。我的第一个字段为string,在这种情况下为t26,第二个字段也为string,在这种情况下为example,第三个字段为uint64_t在这种情况下是1136580077,第四个字段也是字符串,在这种情况下是colox

有任何想法如何有效地完成这项工作?与strtok相比,使用istringstream效率更高?

2 个答案:

答案 0 :(得分:1)

#include <stdint.h>
#include <vector>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

vector<string> spilt(char str[])
{
    vector<string> res;
    char* p;
    char* totken = strtok_s(str, ".", &p);
    while(totken != NULL)
    {
         res.push_back(totken);
         totken = strtok_s(NULL, ".", &p);
    }
    return res;
}

int main()
{
    char str[] = "t26.example.1136580077.colox";
    vector<string> res = spilt(str);
    string field1 = res[0];
    string field2 = res[1];
    uint64_t field3 = atoi(res[2].c_str());
    string field4 = res[3];

    cout<<field1<<" "<<field2<<" "<<field3<<" "<<field4<<endl;
}

答案 1 :(得分:0)

编写一个分割字符串并限定密钥组件的函数。鉴于您对效率的关注,使用strchr定位点和strncpy以提取组件值,其中strncpy的长度由指针增量确定。

这是一些未经测试的伪代码:

const int MAX_COMP_SIZE = 256;

int count = 0;
const char *p = key;

if (p != NULL) 
{
    char comp[MAX_COMP_SIZE];
    const int CompSize = sizeof(comp)/sizeof(comp[0]);

    while (*p != '\0')
    {
        const char *q = strchr(p, '.');

        if (q != NULL)
        {
            int len = q - p;

            if (len >= CompSize)
                return -1;

            strncpy(comp, p, q-p)[len] = '\0';
        }
        else
        {
            if (strlen(p) >= CompSize)
                return -1;

            strcpy(comp, p);
        }

        // store/verify key components based on index, count
        // implement in separate function
        switch(count)
        {
            case 0: ...
            case 1: ...
            default: return -1;
        }

        count++

        if (q == NULL)
            break;

        q++; // skip dot

        p = q; // setup next

    }

}   

if (count < REQUIRED_KEY_COMPONENTS)
    return -1;