如何用C语言编写一个程序来给一个数组添加转义字符

比如现在有一个数组:
Data1=5A 04 40 01 AD crc_L crc_H A5
如何编写一个程序,让Data1变成:
AD 5A 04 40 01 AD AD crc_L crc_H AD A5
简单点说就是:逢5A 或AD 或 A5就在前面增加AD,上面的只是示例,如果crc_L或者crc_H是上述5A或AD或A5,也需要在前面增加AD。
Data1数组的个数定为n,是个不定长的数。
希望有个验证过的程序,尽量简洁通用。

以下是一个用C语言编写的程序,可以实现给一个数组添加转义字符的功能:

#include <stdio.h>

#define MAX_SIZE 1000 // 数组最大尺寸

int main() {
    unsigned char Data1[MAX_SIZE] = {0x5A, 0x04, 0x40, 0x01, 0xAD, 0x01, 0x02, 0xA5}; // 原始数组
    unsigned char Data2[MAX_SIZE * 2] = {0}; // 添加转义字符后的数组
    int n = 8; // 数组长度
    int i, j = 0;

    for (i = 0; i < n; i++) {
        if (Data1[i] == 0x5A || Data1[i] == 0xAD || Data1[i] == 0xA5 || Data1[i] == 0xAA) {
            Data2[j++] = 0xAD;
        }
        Data2[j++] = Data1[i];
    }

    // 输出添加转义字符后的数组
    for (i = 0; i < j; i++) {
        printf("%02X ", Data2[i]);
    }
    printf("\n");
  
    return 0;
}

程序中使用了两个数组,Data1是原始数组,Data2是添加转义字符后的数组,可以根据需要调整最大尺寸。在遍历原始数组的过程中,如果当前元素是0x5A、0xAD或0xA5,就在添加转义字符后再把当前元素加入到Data2中。最后输出添加转义字符后的数组即可。

另外需要注意的一点是,0xAD是转义字符,在原始数组中也有可能出现,因此额外增加了0xAA作为转义字符,表示把0xAD转义为0xAA和0xAB两个字符,这一点可以根据需求修改。

#include <stdio.h>

void add_escape(unsigned char *data, int n) {
    int i;
    for (i = 0; i < n; i++) {
        if (data[i] == 0x5A || data[i] == 0xAD || data[i] == 0xA5 || 
            data[i] == 0x5A || data[i] == 0xAD || data[i] == 0xA5) {
            memmove(data+i+1, data+i, n-i);
            data[i] = 0xAD;
            n++; // length increased
            i++; // skip the escaped byte
        }
    }
}

int main() {
    unsigned char Data1[] = {0x5A, 0x04, 0x40, 0x01, 0xAD, 0x1C, 0xA5};
    int n = sizeof(Data1) / sizeof(unsigned char);
    add_escape(Data1, n);
    // print the result
    int i;
    for (i = 0; i < n; i++) {
        printf("%02X ", Data1[i]);
    }
    printf("\n");
    return 0;
}

答案参考ChatGPT Plus





#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

void addEscapeCharacters(unsigned char* data, int* length) {
    int i, j;

    for (i = 0; i < *length; i++) {
        if (data[i] == 0x5A || data[i] == 0xAD || data[i] == 0xA5) {
            (*length)++;  // 原数组长度增加1
            for (j = (*length) - 1; j > i; j--) {
                data[j] = data[j - 1];  // 后移一位
            }
            data[i] = 0xAD;  // 在当前位置插入转义字符
            i++;  // 跳过刚插入的转义字符
        }
    }
}

int main() {
    unsigned char data1[] = {0x5A, 0x04, 0x40, 0x01, 0xAD, 0xcrc_L, 0xcrc_H, 0xA5};
    int length = sizeof(data1) / sizeof(data1[0]);

    printf("原始数组:\n");
    for (int i = 0; i < length; i++) {
        printf("%02X ", data1[i]);
    }

    addEscapeCharacters(data1, &length);

    printf("\n添加转义字符后的数组:\n");
    for (int i = 0; i < length; i++) {
        printf("%02X ", data1[i]);
    }

    return 0;
}

真人作答,非GPT,纯手工代码。先上运行结果:

img

转换过程单独封装了一个函数,逢X可以根据你需要放入target数组,代码注释比较齐全。
代码:

#include <stdio.h>
#include <string.h>

/**功能:将src字符串数组中,存在于target中的字符串前面添加AD
  *param[in] src 需要替换的源字符数组
  *param[in] n 数组中字符的个数
  *param[in] target 需要找的关键字符数组,比如5A、AD等这些东西
  *param[in] m 关键字符的个数
  *param[out] dst 插入AD后的新字符数组
  *param[out] k 新数组元素个数
  */
void convert(const char src[],int n,const char target[],int m,char dst[],int* k)
{
    int i,j;
    int s = 0;
    for(i=0;i<n;i++)
    {
        //判断src[i]是否是关键字符
        for(j=0;j<m;j++)
        {
            if(src[i] == target[j])
                break;
        }
        if(j<m) //是关键字符
        {
            dst[s++] = 0xAD;
        }
        dst[s++] = src[i];
    }
    *k= s;
}

int main()
{
    char src[] = {0x5A,0x04,0x40,0x01,0xAD,0x33,0x55,0xA5};
    char target[] ={0x5A,0xAD,0xA5}; //关键字符,根据你的需要写入数组即可
    int n = 8; //src中8个元素
    int m = 3; //target中3个元素
    char dst[20]={0}; //dst保存插入转义字符后的新字符数组,空间需要足够大
    int k = 0;  //插入转义字符后新数组的实际元素个数

    int i= 0;
    //调用函数插入转义字符
    convert(src,n,target,m,dst,&k);

    printf("源字符数组:\n");
    for(i=0;i<n;i++)
        printf("%02X ",src[i]&0XFF);

    printf("\n\n逢");
    for(i=0;i<m;i++)
        printf("%02X ",target[i]&0XFF);
    printf("添加AD");

    //输出
    printf("\n\n插入转义字符后:\n");
    for(i=0;i<k;i++)
        printf("%02X ",dst[i]&0XFF);

    return 0;

}


#include <stdio.h>
#include <string.h>
 int main() {
    char arr[100];  // 定义一个长度为100的字符数组
    char target;    // 需要添加转义字符的目标字符
    char result[200];   // 存储转义后的结果字符串
    int j = 0;  // 转义后的字符串下标
    int len;    // 输入的字符串长度
     printf("请输入一个字符串:");
    fgets(arr, 100, stdin); // 从标准输入流中读取字符串
    len = strlen(arr);  // 计算输入字符串的长度
     printf("请输入需要添加转义字符的目标字符:");
    scanf("%c", &target);   // 从标准输入流中读取目标字符
     for (int i = 0; i < len; i++) {
        if (arr[i] == target) {
            result[j++] = '\\'; // 添加转义字符
        }
        result[j++] = arr[i];   // 将字符添加到结果字符串中
    }
    result[j] = '\0';   // 在结果字符串末尾添加空字符
     printf("转义后的字符串为:%s\n", result);
     return 0;
}

程序首先定义了一个长度为100的字符数组arr、一个需要添加转义字符的目标字符target和一个长度为200的字符数组result,用于存储转义后的结果字符串。

程序从标准输入流中读取一个字符串,并计算输入字符串的长度。然后从标准输入流中读取需要添加转义字符的目标字符。

程序使用一个for循环遍历输入的字符串,如果当前字符等于目标字符,则在结果字符串中添加转义字符“\”,然后将当前字符添加到结果字符串中。最后,在结果字符串末尾添加空字符。

最后,程序输出转义后的字符串。

img


#include <stdio.h>
#include <stdlib.h>

void addEscapeChars(unsigned char* data, int* length) {
    int i, j;
    int newLength = *length;

    for (i = 0; i < *length; i++) {
        if (data[i] == 0x5A || data[i] == 0xAD || data[i] == 0xA5) {
            newLength++;
        }
    }

    unsigned char* newData = (unsigned char*)malloc(newLength * sizeof(unsigned char));
    if (newData == NULL) {
        printf("内存分配失败!\n");
        return;
    }

    j = 0;
    for (i = 0; i < *length; i++) {
        if (data[i] == 0x5A || data[i] == 0xAD || data[i] == 0xA5) {
            newData[j++] = 0xAD;
        }
        newData[j++] = data[i];
    }

    free(data); // 释放原始数据的内存
    data = newData;
    *length = newLength;
}

int main() {
    unsigned char Data1[] = { 0x5A, 0x04, 0x40, 0x01, 0xAD, 0x5A, 0xAD, 0xA5 };
    int length = sizeof(Data1) / sizeof(Data1[0]);

    printf("原始数据:\n");
    for (int i = 0; i < length; i++) {
        printf("%02X ", Data1[i]);
    }
    printf("\n");

    addEscapeChars(Data1, &length);

    printf("添加转义字符后的数据:\n");
    for (int i = 0; i < length; i++) {
        printf("%02X ", Data1[i]);
    }
    printf("\n");

    return 0;
}

参考GPT