我使用这个递归函数在HTML中查找标签,输出现在还可以,但我对这个函数find_tag
的返回值更感兴趣是:
-somelargenumber
html
head
body
其中-somelargenumber
是函数的返回值,每次运行编译的程序时它都不同。
但根据我制作的函数,它必须在某个时间点返回0而不是任何其他值。有人可以解释一下吗?
#include<string>
#include<regex>
#include<iostream>
#include<iomanip>
using namespace std;
int find_tag(const string& s,vector<string> & cont )
{
smatch m;
if(s.size()>0)
{
if(regex_search(s,m,regex("<(.*)>(.*)</\\1>")))
{
cont.push_back(m[1]);
find_tag(m[2],cont);
find_tag(m.suffix(),cont);
}
else
{
return 0;
}
}
else
{
return 0;
}
}
int main()
{
cmatch m;
vector<string> cont;
string data {"<html><head>head data</head><body>body data</body></html>"};
cout<<find_tag(data,cont);
if(!(cont.empty()))
{
for(auto &a:cont)
{
cout<<a<<endl;
}
}
else
{
cout<<"\n not found";
}
return 0;
}
PS:我不想在这里解析任何HTML。我只对函数的返回值感兴趣。
答案 0 :(得分:1)
The answer by @hades2510可以解决您的问题。
改善建议。
将函数名称更改为find_tags
,因为您希望以递归方式找到许多标记。
您不需要返回类型为int
。它看起来并不实用。如果您有任何标签,它们将通过输出参数返回。
如果你这样做,该功能可以简化为:
void find_tags(const string& s,vector<string> & cont )
{
smatch m;
if(regex_search(s,m,regex("<(.*)>(.*)</\\1>")))
{
cont.push_back(m[1]);
find_tags(m[2],cont);
find_tags(m.suffix(),cont);
}
}
答案 1 :(得分:0)
你需要:
return find_tag(m.suffix(),cont);
因为即使递归完成也不会这样做,所以你没有抓住它。
您看到的大量数字是编译器在递归完成后在堆栈中找到的内容。这取决于编译器,但很可能是find_tag
的地址和data
的某些地址的组合。