如何在点上拆分字符串并有效地提取所有字段?
Posted
技术标签:
【中文标题】如何在点上拆分字符串并有效地提取所有字段?【英文标题】:How to split the string on a dot and extract all the fields efficiently? 【发布时间】:2013-11-26 05:12:09 【问题描述】:我正在尝试在点上拆分我的实际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
。
有什么想法可以有效地做到这一点吗?与istringstream
相比,使用strtok
效率更高?
【问题讨论】:
使用strtok效率更高 @AliKazmi,只是好奇为什么会这样? strtok是基于c的函数,说到C#中的Split函数,它代表用户调用strtok,所以我们不直接调用strtok,节省一些执行时间吗? 【参考方案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;
【讨论】:
不使用 while 循环有没有办法提取所有内容,以便我可以将单个值放入其数据类型中? 我认为你不能。 Mybe,您应该使用一些正则表达式库。 我明白了.. 如果我们需要使用 while 循环,那么如何将单个字段值放入其相应的数据类型中,如我在问题中所示? @TrekkieTechieT-T 我已经更新了我的答案,请试一试。 谢谢。添加代码并编译后,这就是我得到的error: âstrtok_sâ was not declared in this scope
。知道如何解决这些问题吗?【参考方案2】:
编写一个拆分字符串并限定键的组件的函数。考虑到您对效率的关注,请使用 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;
【讨论】:
以上是关于如何在点上拆分字符串并有效地提取所有字段?的主要内容,如果未能解决你的问题,请参考以下文章