尖括号转义-C语言实现版本

需求:

字符串是xml格式的字符串,但是某个标签值存在尖括号,需要把'<'替换成"&lt",把'>'替换成"&gt"

例如:

0123456789<Root><>r423><432423<<</Root>3gfdgfd

转换后

0123456789<Root>&lt&gtr423&gt&lt432423&lt&lt</Root>3gfdgfd

实现:

/*
 * @Author: syouya.shiraki@outlook.com 
 * @Date: 2019-11-26 14:16:58
 * @LastEditTime: 2019-11-26 17:15:19
 * @LastEditors: Please set LastEditors
 * @Description: 指定标签尖括号转义
 */

#include <stdio.h>
#include <string.h>
#define USTRD_MAX_LEN 280
#define USTRD_TAG_HEAD "<Root>"
#define USTRD_TAG_TAIL "</Root>"
#define LEFT_ANGLE_BRACKET '<'
#define RIGHT_ANGLE_BRACKET '>'
#define LEFT_ANGLE_BRACKET_ESCAPING "&lt"
#define RIGHT_ANGLE_BRACKET_ESCAPING "&gt"


/**
 * @description: 查找指定地址串中中是否存在尖括号
 * @param pstr_start-起始地址
 *        pstr_end-结束地址
 * @return: 
 */
int find_angle_bracket(char *pstr_start, char *pstr_end)
{
    char *pstr = pstr_start;
    while (pstr <= pstr_end)
    {
        if (*pstr == LEFT_ANGLE_BRACKET || *pstr == RIGHT_ANGLE_BRACKET)
        {
            return 0;
        }
        else
        {
            pstr++;
        }
    }
    return -1;
}




/**
 * @description: 转义指针所覆盖到范围类的尖括号,如果转义后过长则截断。
 * @param: pstr_start-起始地址 
 *         pstr_end-结束地址
 *         dest-转义后字符存放地址
 *         dest_len-dest长度
 * @return: 
 */
int to_escaping(char *pstr_start, char *pstr_end, char *dest, int dest_len)
{
    int idx = 0;
    char *pstr = pstr_start;
    memset(dest, 0, dest_len);
    while (pstr < pstr_end && idx < dest_len)
    {
        if (*pstr != LEFT_ANGLE_BRACKET)
        {
            if (*pstr != RIGHT_ANGLE_BRACKET)
            {
                *(dest + idx) = *pstr;
                idx = idx + 1;
            }
            else
            {
                memcpy(dest + idx, RIGHT_ANGLE_BRACKET_ESCAPING, strlen(RIGHT_ANGLE_BRACKET_ESCAPING));
                idx = idx + strlen(RIGHT_ANGLE_BRACKET_ESCAPING);
            }
        }
        else
        {
            memcpy(dest + idx, LEFT_ANGLE_BRACKET_ESCAPING, strlen(LEFT_ANGLE_BRACKET_ESCAPING));
            idx = idx + strlen(LEFT_ANGLE_BRACKET_ESCAPING);
        }
        pstr++;
    }
}


/**
 * @description:  替换字符串中尖括号,进行转义
 * @param buf-输入原串,处理后修改该buf
 *        len-buf长度
 * @return: 0-succ
 */
int replace_ustrd(char *buf, int len)
{
    char dest[USTRD_MAX_LEN * 3];
    char tail[USTRD_MAX_LEN * 3];
    char *pstr_start = NULL;
    char *ustrd_start = strstr(buf, USTRD_TAG_HEAD);
    char *pstr_end = strstr(buf, USTRD_TAG_TAIL);

    pstr_start = ustrd_start + strlen(USTRD_TAG_HEAD);

    if (pstr_start == NULL || pstr_end == NULL)
    {
        //不处理
        return 0;
    }
    if (find_angle_bracket(pstr_start, pstr_end) == -1)
    {
        return 0;
    }
    memset(dest, 0, sizeof(dest));
    to_escaping(pstr_start, pstr_end, dest, sizeof(dest));
    memset(tail, 0x00, sizeof(tail));
    memcpy(tail, pstr_end, strlen(pstr_end));
    snprintf(pstr_start, len - (pstr_start - buf), "%s%s", dest, tail);
    return 0;
}
/**
 * @description: 测试
 * @param 
 * @return:0-succ 
 */
int main()
{
    char *buf = "0123456789<Root><>r423><432423<<</Root>3gfdgfd";
    char arr[10240];
    memset(arr, 0, sizeof(arr));

    memcpy(arr, buf, strlen(buf));
    printf("source = [%s]\n", arr);
    replace_ustrd(arr, sizeof(arr));
    printf("result = [%s]\n", arr);
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值