C语言出现strcat参数错误、指针与整数比较警告求助
问题根因与修复方案
你的两处编译警告以及代码中隐藏的逻辑错误、类型错误如下,逐个修复即可解决问题:
警告1:第12行 指针与整数类型比较
- 核心错误是混淆了C语言的字符和字符串表示规则:单引号
''包裹的是char类型的单个字符,双引号""包裹的是字符串,本质是const char*类型的指针。你写的"<"、"/"、">"都是字符串指针,拿string[i](char类型,本质是小整数)和指针做比较,自然触发类型不匹配警告。 - 附加逻辑错误:判断条件中误用了
||(逻辑或),该条件永远为真——单个字符不可能同时等于<、/、>三个值,要实现“排除三个符号”的逻辑,必须用&&(逻辑与)连接判断条件。
警告2:第15行 strcat传参整数转指针无显式转换
这里存在3个关联错误:
new_string被定义为单个char类型变量,不是可写入、有足够存储空间的字符缓冲区,而strcat第一个参数要求是char*类型(指向可写字符数组的指针),传入单个char变量相当于把字符的整数值当成内存地址使用,触发类型警告。strcat第二个参数要求是const char*类型的字符串,你传入的string[i]是单个char类型,参数类型完全不匹配。- 隐藏类型错误:
strlen返回值是size_t(无符号整数类型),用char类型存储长度不仅类型不匹配,还会因为char取值范围过小(通常为-128~127)在处理稍长字符串时出现溢出问题。
修正后可运行代码
你当前阶段的需求是剥离HTML标签的尖括号等符号,直接遍历字符按下标赋值比调用strcat更简单高效,也不会出现参数类型错误:
#include <stdio.h> #include <string.h> int main() { char string[] = "<h1>heading 1</h1>"; size_t string_len = strlen(string); // 开辟和原字符串等大的缓冲区,初始化全0避免垃圾值 char new_string[sizeof(string)] = {0}; int write_pos = 0; for (size_t i = 0; i < string_len; i++) { if (string[i] != '<' && string[i] != '/' && string[i] != '>') { new_string[write_pos++] = string[i]; } } new_string[write_pos] = '\0'; // 手动补充字符串结束符 printf("%s\n", new_string); return 0; }
运行上述代码会输出h1heading 1h1,你可以在此基础上继续扩展标签识别、属性解析等HTML解析器功能。
内容的提问来源于stack exchange,提问作者Farzeen Ghaus
相关产品推荐
相关产品推荐

