预建函数,用于查找字符串中的字符序列
Prebuilt function to find character sequence in a string?
我正在处理一个多线程项目,对于项目的一个片段,我需要查找字符串中是否存在给定的字符序列。我想知道C++/C是否有任何预构建的函数可以处理这个问题,但我很难弄清楚要搜索的确切"定义"。
我知道"strtr"answers"find",问题是函数需要能够找到一个在字符串中拆分的序列。
给定字符串"Hello World",如果序列"H-W-l"存在,我需要一个返回true的函数。有什么预先构建的东西可以处理这个问题吗?
据我所知,子序列搜索本身不是标准C库或标准C++库的一部分。
但是,您可以将子序列搜索表示为正则表达式或"glob"。Posix同时要求regex和glob匹配函数,而C++标准库自C++11以来就包含正则表达式。这两种技术都需要修改搜索字符串:
-
正则表达式:
HWl
⇒CCD_ 2。regexec
将搜索正则表达式(除非锚定,否则此表达式不是锚定的);在C++中,您可能希望使用std::regex_search
而不是std::regex_match
。 -
球:
HWl
⇒*H*W*l*
。全局匹配总是完全匹配的,尽管在我所知道的所有实现中,后面的*
都经过了优化。这可用作Posix标头fnmatch.h
中的fnmatch
函数。对于此应用程序,请为flags参数提供0
。
如果你不喜欢上面的任何一个,你可以在一个简单的循环中使用标准的strchr
函数:
bool has_subsequence(const char* haystack, const char* needle) {
const char* p;
for (p = haystack; *needle && (p = strchr(p, *needle)); ++needle) {
}
return p != NULL;
}
如果我理解正确,那么您正在尝试按给定顺序搜索char
,但不一定是连续的。如果您使用C++,我不明白为什么不能在<algorithm>
系统头下使用std::find
函数。我会将两者加载到一个字符串中,然后按如下方式搜索:
bool has_noncontig_sequence(const std::string& str, const std::string& subStr)
{
typedef std::string::const_iterator iter;
iter start = str.begin();
// loop over substr and save iterator position;
for (iter i = subStr.begin(); i != subStr.end(); ++i)
start = std::find(start, str.end(), *i);
// check position, if at end, then false;
return start != str.end() ? true : false;
}
std::find
函数将把start
定位在str
中的第一个正确字符上(如果它能找到),然后搜索下一个。如果不能,则start
将被定位在末尾,表示失败。
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 将 NULL 与 C 的字符* 字符串一起使用
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 无法将常量字符字符串传递给模板类
- 如何组合一个宽字符字符串,中间插入一些空字符
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 从给定索引返回子字符字符串的函数
- 字符 [](c 字符串)的初始化标准
- 如何将字符字符串用作数学运算符
- 将 Unicode 字符/字符串写入文件
- C++,字符* 字符串修改
- 如何有效地用不同的整数元素替换字符字符串的元素
- C++:如果我们在字符串中添加一些整数,为什么它会从开头删除该数量的字符?(字符串 + 整数)
- strcpy正在复制sth字符i字符串.如何解决此错误
- 在C++中将双精度转换为字符*/字符串
- C 中的宽字符字符串
- 如何提取C 中的字符/字符串之间的字符串
- 无法将字符/字符串转换为int
- 带有指针的反转字符字符串
- 反转字符串中的 n 个字符(字符串中没有空格),而不使用 c++ 中的内置函数