有时候,一个集合以字符串的形式存在,以分隔符进行分隔。
如: strGroupIP = "192.168.20.140,192.168.20.141,192.168.20.142,192.168.20.143";
在上述IP集合中查找 strIP = "192.168.20.14";
如果使用string.find()进行查找,可以找到, 但不是我们需要的ip, 属于不完全匹配。
为了解决上述问题, 我编写了一个函数。如下:
/* strElement: 元素, strCollection: 集合, */
bool isFindSubString(const std::string strElement, const std::string strCollection, const std::string strDelim)
{
char *pchArr = new char[strCollection.length()+1];
if(NULL == pchArr)
{
return false;
}
memcpy(pchArr, strCollection.c_str(), strCollection.length()+1);
char *pToken = NULL;
pToken = strtok(pchArr, strDelim.c_str());
while(pToken)
{
if(pToken == strElement)
{
delete pchArr;
pchArr = NULL;
return true;
}
pToken = strtok(NULL, strDelim.c_str());
}
delete pchArr;
pchArr = NULL;
return false;
}
测试函数:
void test01()
{
#if 0
const std::string strMuster = "192.168.20.10^_^192.168.20.11^_^192.168.20.12^_^192.168.20.13^_^192.168.20.110";
const std::string strElement = "192.168.20.13";
const std::string strDelim = "^_^";
#else
const std::string strMuster = "192.168.20.10,192.168.20.11,192.168.20.12,192.168.20.13,192.168.20.110";
const std::string strElement = "192.168.20.13";
const std::string strDelim = ",";
#endif
bool bRet = isFindSubString(strElement, strMuster, strDelim);
if(bRet)
{
std::cout << "succeed to match" << std::endl;
}
else
{
std::cout <<"fail to match" << std::endl;
}
}
上述的isFindSubString存在这个问题:
集合中的分隔符两侧不能有空格,
例如如下则找不到:
const std::string strMuster ="192.168.20.10, 192.168.20.11, 192.168.20.12, 192.168.20.13, 192.168.20.110 ";
const std::string strElement = "192.168.20.13";
const std::string strDelim = ",";