在字符串C++中查找子字符串(在"hello"中查找"el")
Finding substring within string C++ (find "el" in "hello")
好的,所以我正在寻找一种算法,可以帮助我在子字符串中找到字符串。我以前使用的代码来自一个类似的问题,但它不起作用
// might not be exposed publicly, but could be
int index_of(string const& haystack, int haystack_pos, string const& needle) {
// would normally use string const& for all the string parameters in this
// answer, but I've mostly stuck to the prototype you already have
// shorter local name, keep parameter name the same for interface clarity
int& h = haystack_pos;
// preconditions:
assert(0 <= h && h <= haystack.length());
if (needle.empty()) return h;
if (h == haystack.length()) return -1;
if (haystack.compare(h, needle.length(), needle) == 0) {
return h;
}
return index_of(haystack, h+1, needle);
}
int index_of(string haystack, string needle) {
// sets up initial values or the "context" for the common case
return index_of(haystack, 0, needle);
}
这不会返回字符串"hello"上的起始索引"el",我也搞不清楚。
编辑:好吧,让我向您展示更多的代码,包括一些现实生活中的示例:我试图分析一个字符串,它是我想在文件系统中排序的文件的路径。输入示例如下:
输入:/media/seagate/lol/Sons.of.Archy.S04.720p.HDTV.x264/Sons.of-Archy.S04E01.720p.HDTV.xs264-IMMERSE.mkv
当我试图通过检测SxxExx的存在来解析这个字符串以获得的名称时,我会寻找"s0"、"s0"等(我知道这不是最好的实现,我只是想看看它是否有效,然后再看代码)。所以当我使用这个输入时,我在输出上得到的是:
input:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv
aux: 0p.HDTV.x264-IMMERSE.mkv
input:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv
aux: 1.720p.HDTV.x264-IMMERSE.mkv
input:/media/seagate/lol/Sons.of.Anarchy.S04.720p.HDTV.x264/Sons.of.Anarchy.S04E01.720p.HDTV.x264-IMMERSE.mkv
aux: 264-IMMERSE.mkv
aux的预期输出:S04E01.720p.HDTV.x264-IMMERSE.mkv
因此,正如你所看到的,它只是在寻找字符串中的任何字符并停止,这也解释了多个有效的"已找到",而这些字符本应只是一个。
我尝试使用的完整代码是:
bool StringWorker::isSeries(size_t &i) {
size_t found1, found2, found3, found4, found5, found6;
found1 = input->find_last_of("S0"); //tried several find functions including the
found2 = input->find_last_of("S1"); //index_of() mentioned above in the post
found3 = input->find_last_of("S2");
found4 = input->find_last_of("s0");
found5 = input->find_last_of("s1");
found6 = input->find_last_of("s2");
if (found1 != string::npos) {
if (input->size() - found1 > 6) {
string aux = input->substr(found1, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found1;
return true;
}
}
}
if (found2 != string::npos) {
if (input->size() - found2 > 6) {
string aux = input->substr(found2, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found2;
return true;
}
}
}
if (found3 != string::npos) {
if (input->size() - found3 > 6) {
string aux = input->substr(found3, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found3;
return true;
}
}
}
if (found4 != string::npos) {
if (input->size() - found4 > 6) {
string aux = input->substr(found4, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found4;
return true;
}
}
}
if (found5 != string::npos) {
if (input->size() - found5 > 6) {
string aux = input->substr(found5, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found5;
return true;
}
}
}
if (found6 != string::npos) {
if (input->size() - found6 > 6) {
string aux = input->substr(found6, input->size());
cout << "input:" << *input << endl;
cout << "aux: " << aux << endl;
if (isalpha(aux.at(0)) && isdigit(aux.at(1)) && isdigit(aux.at(2))
&& isalpha(aux.at(3)) && isdigit(aux.at(4))
&& isdigit(aux.at(5))) {
i = found6;
return true;
}
}
}
return false;
}
你看到这里有什么不对吗?
为什么不使用std::string
->链接的find()
方法呢。
此代码通过index = sub_str.find("el")
:返回索引
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string sub_str="abc def ghi jk lmnop hello";
string sub_str2;
size_t index;
index = sub_str.find("el");
sub_str2 = sub_str.substr (index);
cout<<"index = "<<index<<"n";
cout<<sub_str2<<"n";
return 0;
}
要在字符串中查找子字符串及其索引,可以尝试以下方法-
int find_sub(const std::string& mstring,sub)
{
int lensub=sub.length(),len=mstring.length(),f=0,pos;
std::string b="";
for(int i=0;i<len-lensub;i++)
{
for(int j=i,k=0;j<i+lensub;j++,k++)
b[k]=mstring[j];
if(b.compare(sub)==0)
{
f=1;
pos=i;
break;
}
}
if(f==1)
cout<<"substring found at: "<<pos+1;
else
cout<<"substring not found!";
return f;
}
您还可以通过删除break;
并每次增加f的值来检查子字符串出现的次数。还可以通过将pos转换为数组来获取它们的索引。
相关文章:
- 使用正则表达式regex_search在字符串中查找字符串
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 在 c++ 中查找字符串中没有循环的数字总和
- 查找字符串可以减少到 0 的步骤数
- C++ 查找字符串中存在的元素向量
- 查找字符串中最常见的字母
- C++使用旧编译器GCC 4.4.0在结构列表中查找字符串
- 查找字符串是否包含字符串向量的任何一个元素的最佳方法
- 如何使用字符串流查找字符串中的整数总和?
- 穿过链接列表以查找字符串
- 查找字符串中存在的不同字符
- 如何使用 std::find 从向量的第一个元素中查找字符串<字符串对<字符串、字符串> >类型?
- 如何从C++的输入中查找字符串并将其替换为另一个字符串
- C++在多个字符串中查找字符串
- 使用std :: quare_range查找字符串向量中发生的前缀范围
- 在字符串列表中查找字符串,然后将字符串设置为找到的字符串?
- 尝试在类的向量中查找字符串
- 是否有一种算法可以查找字符串中任何指定字符的第一次出现
- 在.txt中查找字符串并获取C++中的行内容
- 如何在考虑标点符号的同时在文件中查找字符串