我正在尝试将实际的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
效率更高?
答案 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;