gpt4 book ai didi

c++ - 在 C 中解析一个 html 表变得有趣

转载 作者:太空宇宙 更新时间:2023-11-04 05:59:48 25 4
gpt4 key购买 nike

我今天有空,所以我说为什么不尝试用 c 解析 html 表(和一些用于流的 c++)所以我做了以下

int main()
{
char html[] ="<tr> \
<td>row 1, cell 1 < / td > \
<td>row 1, cell 2 < / td > \
< / tr> \
<tr> \
<td>row 2, cell 1 < / td > \
<td>row 2, cell 2 < / td > \
< / tr> ";

for (int i = 0; i < (int)(sizeof(html)/sizeof(html[0])); i++)
{
if (html[i] == '<')
{
for (int j = i + 1;; j++)
{
if (html[j] == '>')
{
for (int c = j + 1;; c++)
{
if (html[c] == '<')
break;
std::cout << html[c];
}
break;
}
}
}
}
return 0;
}

我第一次尝试左边的屏幕,但我在第二次尝试右边的时候做得更好

enter image description here

谁能通过隐藏那些不需要的符号来让它变得更好?

在使用 strlen(html) 之后我也去这个

enter image description here

最佳答案

除非您允许我远程访问您的计算机,否则我无法隐藏这些有趣的符号。但是,我可以建议您检查内部循环的终止条件,如下所示:

for (int c = j + 1;; c++)
{
if ((html[c] == '<') || c >= strlen(html))
return 0;
std::cout << html[c];
}

顺便说一句:

  • sizeof 看起来有点奇怪。
    • sizeof(char) 保证为 1,因此除法是多余的。
    • 如果解析器只能在常量输入上工作,那么它的用途有限,所以我宁愿在这里使用 strlen(如果性能有问题,可能将其缓存到本地 :))。
  • 您的 3 个嵌入式循环正在引导您快速到达屏幕的右边缘。
    你不会有一个真正的解析器那样工作。
    通常的方法是使用有限状态机,使用分词器将输入分成可管理的 block 。

编辑:

我使用 strlen 使与您的外部循环的代码重复更加明显。
您确实可以测试字符串终止以避免 Schlemiel the Painter's algorithm 的教科书案例,但这并不能挽救全局设计。

编辑(之二)

正如 Charles Beattie 指出的那样,这种方法的主要缺点之一是将整个输入视为一大块文本,使处理变得笨拙和缓慢。

这是分词器方法的好处之一:提取小的语法元素并将它们作为抽象对象使用,而不是费力地处理整个输入。

关于c++ - 在 C 中解析一个 html 表变得有趣,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21020554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com