【发布时间】:2020-05-30 17:49:32
【问题描述】:
最近,我遇到了一个编码问题,我们必须解析提及的 HTML 实体。需要解析以下这些实体 -
-
"到 " -
'到 - ' -
>到 > -
<到 -
&到 & -
⁄到 ⁄
将给出一个字符串txt,必须按照上述规则进行解析。以下是我的方法,效果很好。
string parse(string txt){
int n=txt.size();
for(int i=0;i<n;i++){ //edit : why don't I get an error even though I loop for full length after erasing some elements of string?
if(txt[i]=='&'){
if(i+5<n&&txt.substr(i,6)=="""){
txt[i]='"';
txt.erase(i+1,5);
}
else if(i+5<n&&txt.substr(i,6)=="'"){
txt[i]=(char)(39); //I also wasn't able to do like this -txt[i]='\''; would be nice if someone tells why this gave error
txt.erase(i+1,5);
}
else if(i+4<n&&txt.substr(i,5)=="&"){
txt[i]='&';
txt.erase(i+1,4);
}
else if(i+3<n&&txt.substr(i,4)==">"){
txt[i]='>';
txt.erase(i+1,3);
}
else if(i+3<n&&txt.substr(i,4)=="<"){
txt[i]='<';
txt.erase(i+1,3);
}
else if(i+6<n&&txt.substr(i,7)=="⁄"){
txt[i]='/';
txt.erase(i+1,6);
}
}
}
return txt;
}
我觉得我以最粗鲁的方式做到了。但我想知道是否有另一种方法比我的代码更简单(可能更短)。
感谢任何帮助或方法!
EDIT :正如评论引起我注意的那样,我的循环实际上使用了原始字符串长度n,但在循环减少txt 字符串长度时我正在删除一些元素。令人惊讶的是,我没有收到任何错误,如果有人解释原因会有所帮助吗?
【问题讨论】:
-
收集'&'和';'之间的所有字符首先,然后在一个固定的查找图中查找所有收集到的字符,替换它。据我估计,大约四分之一的代码。结束。
-
@SamVarshavchik 我尝试在我的代码中使用
replace(),但这给了我分段错误......但是通过适当的实现可能会起作用。但我想知道是否有一种方法/内置方法可以替换我们传递给它的给定子字符串(在我们的例子中是 HTML 实体)的所有出现? -
当我写“替换它”时,我并不一定是指实际使用
replace()。 C++ 库中没有任何东西可以进行这种替换。此任务的全部目的是展示您自己实现新算法的能力,而不是依赖 C++ 库中现有的算法。 -
你确定上面的代码工作正常吗?你有
n = txt.size(),但是你在擦除时调整n吗?似乎您的代码中的任何擦除都会导致越界访问。 -
@paler123 好消息!实际上这并没有给出任何错误。我不知道该功能是如何工作的,现在我真的想知道如何?
标签: c++ string algorithm parsing