进入主题,在c++里,想要分割字符串真的很恶心。要是在java里面,一句str.split(“,”,-1);就解决的事情,在C++里面,就非常纠结。。string里面没有split方法。
于是在网上找啊找,找到了一个诡异的strtok函数,,非常诡异啊。。
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
之前这个strtok (str," ,.-");还容易理解,到了后面,就来了一个NULL参数的strtok,我无比郁闷啊。。
原来他用的是一个全局变量,来指示当前已经处理的字符串起始位置,因此,这个函数不是线程安全的(thread_safe),如果在多线程中用这个函数,可能就会出现问题。
幸亏有个与之对应的多线程版本,叫做strtok_r(),他仅仅是在之前那个函数的基础上增加了一个参数,直接贴代码吧。。
void split(const char * str,const char * deli, vector<string> *list)
{
char buff[1024];
snprintf(buff,sizeof(buff),str);
char * gg;
char *p = strtok_r(buff, deli, &gg);
list->clear();
while(p !=NULL)
{
list->push_back(p);
p = strtok_r(NULL, deli, &gg);
};
}
这个封装的函数可以实现将一个字符串切分,并且不改变之前的字符串,切分后的字符串通过用户传入的vector<string>参数获得,这个函数木有内存泄露的问题,也是线程安全的,放心使用吧。。
如果确定被切分的字符串不是很长,可以适当减小buff的大小,这样应该可以提高一些效率~
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。