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

如何用C语言仅打印XML标签,跳过标签间的内容?

解决提取XML标签(去除标签间内容)的问题

看了你的代码和需求,你想跳过XML标签之间的内容,只保留所有标签(包括闭合标签),但当前的逻辑有几个问题导致输出不对:

  • 你用同一个索引i同时遍历原字符串和写入目标字符串str2,这会导致str2里出现空位置或重复覆盖的问题
  • 判断条件没考虑标签的闭合符>,也没区分「是否在标签内部」的状态,导致只存了部分字符却没处理完整标签
  • 循环里每次都打印str2,会重复输出中间状态,所以才会看到一堆重复的<a

下面是修正后的代码,我加入了状态标记来区分是否处于标签内部,同时单独维护目标字符串的写入索引:

#include<stdio.h>
#include<string.h>
int main() {
    char str1[50] = {"<a>1</a><b>2</b><c>3</c>"};
    char str2[50]; // 把str2设大一点,避免溢出
    int i = 0, j = 0;
    int in_tag = 0; // 标记是否在标签内部,0=不在,1=在

    while(str1[i] != '\0') {
        if(str1[i] == '<') {
            // 进入标签,标记状态并写入<
            in_tag = 1;
            str2[j++] = str1[i];
        } else if(str1[i] == '>') {
            // 退出标签,标记状态并写入>
            in_tag = 0;
            str2[j++] = str1[i];
        } else if(in_tag == 1) {
            // 如果在标签内部,直接写入当前字符
            str2[j++] = str1[i];
        }
        // 不在标签内部的字符直接跳过
        i++;
    }
    str2[j] = '\0'; // 必须手动添加字符串结束符
    printf("%s\n", str2); // 循环结束后一次性打印结果
    return 0;
}

代码逻辑说明:

  • 用in_tag变量跟踪当前是否处于XML标签内部:遇到<就开启标签状态,遇到>就关闭
  • 只有当处于标签内部,或者遇到</>时,才把字符写入str2,标签之间的内容直接跳过
  • 用单独的j索引维护str2的写入位置,避免和原字符串的遍历索引i冲突
  • 最后一定要给str2加上'\0',否则printf会输出垃圾内容

运行这段代码就能得到你想要的输出:<a></a><b></b><c></c>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:05:59