You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言链表实现HTML标签统计排序程序的问题排查

HTML标签统计程序问题修复指南

1. 标签重复计数问题(如span显示两次计数1)

原因:标签提取时未统一大小写(比如<Span>和<span>被判定为不同标签),或是存储时未正确检查重复项,导致相同标签被多次插入。
修复:

  • 提取标签名后统一转为小写(或大写),消除大小写差异
  • 插入新标签前,遍历已存储的标签列表,用strcmp(统一大小写后)判断是否已存在,存在则直接累加计数,不存在再新增条目

示例代码(标签转小写):

// 提取到标签名后,将所有字符转为小写
for (int i = 0; tag_name[i]; i++) {
    tag_name[i] = tolower((unsigned char)tag_name[i]);
}

2. 乱码/异常标签输出问题(如P/3、Pz▒▒)

原因:提取标签时未过滤非字母数字字符,或是未给标签字符串添加终止符'\0',导致内存中未初始化的垃圾数据被当作标签名输出。
修复:

  • 提取标签内容时,仅保留<之后到空格/>之间的字母数字字符,遇到非字母数字直接停止提取
  • 每个标签字符串末尾必须手动添加'\0',确保字符串正确终止

示例代码(过滤有效字符):

char tag_buf[64];
int pos = 0;
int c = fgetc(stdin);
// 跳过<之后的非字母数字字符(比如可能的/,如</div>)
while (c != EOF && !isalnum((unsigned char)c) && c != ' ' && c != '>') {
    c = fgetc(stdin);
}
// 提取有效标签字符
while (c != EOF && isalnum((unsigned char)c) && pos < sizeof(tag_buf)-1) {
    tag_buf[pos++] = c;
    c = fgetc(stdin);
}
tag_buf[pos] = '\0'; // 必须添加终止符

3. 降序排序错误+段错误问题

原因:排序比较函数逻辑错误(比如写成升序而非降序),或是排序时访问了未初始化的数组元素,亦或是未处理空标签列表的情况。
修复:

  • 修正qsort的比较函数:降序排序时,若b的计数大于a,返回正数;反之返回负数
  • 排序前检查标签列表的有效长度,避免对空数组或越界元素排序
  • 确保排序的数组是已正确初始化的,没有野指针

示例代码(正确的降序比较函数):

typedef struct {
    char *name;
    int count;
} Tag;

// 按计数降序排序的比较函数
int compare_by_count_desc(const void *a, const void *b) {
    const Tag *t1 = (const Tag *)a;
    const Tag *t2 = (const Tag *)b;
    return t2->count - t1->count;
}

// 调用排序前先判断是否有标签
if (tag_list_size > 0) {
    qsort(tag_list, tag_list_size, sizeof(Tag), compare_by_count_desc);
}

额外注意点

  • 内存管理:动态分配的标签名要记得释放,避免内存泄漏
  • 输入处理:要处理HTML中的换行、制表符等空白,避免误判标签的起始和结束位置
  • 参数解析:如果-a和-n同时传入,要明确优先级(比如优先-n),或者提示参数冲突

内容的提问来源于stack exchange,提问作者goldengomi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:13:24