比如现在有一个数组:
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,纯手工代码。先上运行结果:
转换过程单独封装了一个函数,逢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循环遍历输入的字符串,如果当前字符等于目标字符,则在结果字符串中添加转义字符“\”,然后将当前字符添加到结果字符串中。最后,在结果字符串末尾添加空字符。
最后,程序输出转义后的字符串。
#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