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

C语言出现strcat参数错误、指针与整数比较警告求助

问题根因与修复方案

你的两处编译警告以及代码中隐藏的逻辑错误、类型错误如下,逐个修复即可解决问题:

警告1:第12行 指针与整数类型比较

  • 核心错误是混淆了C语言的字符和字符串表示规则:单引号''包裹的是char类型的单个字符,双引号""包裹的是字符串,本质是const char*类型的指针。你写的"<"、"/"、">"都是字符串指针,拿string[i](char类型,本质是小整数)和指针做比较,自然触发类型不匹配警告。
  • 附加逻辑错误:判断条件中误用了||(逻辑或),该条件永远为真——单个字符不可能同时等于<、/、>三个值,要实现“排除三个符号”的逻辑,必须用&&(逻辑与)连接判断条件。

警告2:第15行 strcat传参整数转指针无显式转换

这里存在3个关联错误:

  1. new_string被定义为单个char类型变量,不是可写入、有足够存储空间的字符缓冲区,而strcat第一个参数要求是char*类型(指向可写字符数组的指针),传入单个char变量相当于把字符的整数值当成内存地址使用,触发类型警告。
  2. strcat第二个参数要求是const char*类型的字符串,你传入的string[i]是单个char类型,参数类型完全不匹配。
  3. 隐藏类型错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:01:22