使用字符串拆分进行空检查
Posted
技术标签:
【中文标题】使用字符串拆分进行空检查【英文标题】:Empty check with string split 【发布时间】:2012-08-27 06:05:26 【问题描述】:vector<string> SplitString (string aString,char *sep)
vector<string> vec;
char * cstr,*val,*p;
string str = aString;
cstr = new char [str.size()+1];
strcpy (cstr, str.c_str());
p=strtok (cstr,sep);
while(p!=NULL)
vec.push_back(p);
p=strtok(NULL,sep);
delete[] cstr;return vec;
这是我的字符串拆分代码。我发送下面的字符串用分隔符'&'分割
"f0=fname0&l0=lname0&f1=fname1&l1=lname1&f2=fname2&l2=lname2&f3=&l3=".
我在向量中得到了如下结果。
f0=fname0 l0=lname0 f1=fname1 l1=lname1 f2=fname2 l2=lname2 f3= l3=
现在我再次发送带有分隔符“=”的结果字符串。 它与“l2 = lname2”一起工作正常。但是对于 "f3=" 和 "l3=" 我的分隔符在字符串的最后一个位置。所以我找不到该值是否为 null 。我想知道值('=' 的左侧是名称,右侧是值)是否为空。我怎样才能检查这个。
【问题讨论】:
你可能对this question感兴趣。 【参考方案1】:提升怎么样?我认为这是拆分字符串的最简单方法。
#include <algorithm>
#include <iterator>
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;
int main()
string s("f0=fname0&l0=lname0&f1=fname1&l1=lname1&f2=fname2&l2=lname2&f3=&l3=");
vector<string> v1;
split(v1, s, is_any_of("&"), token_compress_on);
copy(v1.begin(), v1.end(), ostream_iterator<string>(cout, "\n"));
for (auto i : v1)
vector<string> v2;
split(v2, i, is_any_of("="), token_compress_on);
copy(v2.begin(), v2.end(), ostream_iterator<string>(cout, "\n===\n"));
【讨论】:
致命错误:boost/algorithm/string.hpp:没有这样的文件或目录编译终止。【参考方案2】:检查您要标记的字符串的最后一个字符是否实际上是分隔符本身。
while (p != NULL && p[strlen(p) - 1] != *sep)
编辑:根据您的评论,然后在对字符串进行标记之前,我将使用
string::find
和 string::replace
对其进行修改,以将出现的“=&”替换为“=hi&”和终止的“=”用“=嗨”。这样,您将避免尴尬的解析。
此外,您不需要两次标记化,因为 strtok
的 strDelimit
参数可以是“&=”(一次传递中的两个分隔符)。
【讨论】:
结果和以前一样。如果我找到一个空字符串,我想推送一些像“hi”这样的字符串。如果我的字符串如 "f2=fname2&l2=lname2&f3=&l3=" 表示,我想将向量推入 f2,fname2,l2,lname2,f3, hi,l3,hi 。以上是关于使用字符串拆分进行空检查的主要内容,如果未能解决你的问题,请参考以下文章