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

