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
相关产品推荐
相关产品推荐

