网页兼容性站点,app开发需求,跨境电商运营基础知识,网站建设经济成本分析前言
NWAFU 2021阶段二 D 一、题目描述
题目描述
在一个字符串中#xff0c;设置了由‘/’前导字符和某些特定字母构成的转义子字符串#xff0c;如“/s”、“/f”、“/c”等用于表示特殊表情符号。现要求编写一个函数#xff0c;将给定字符串中的转义字符串转换为表情字…前言
NWAFU 2021阶段二 D 一、题目描述
题目描述
在一个字符串中设置了由‘/’前导字符和某些特定字母构成的转义子字符串如“/s”、“/f”、“/c”等用于表示特殊表情符号。现要求编写一个函数将给定字符串中的转义字符串转换为表情字符串同时其他字符保持不变然后返回转换后的字符串首地址。需要转义的符号串仅有以下4个
原字符串中的特殊符号子串要转成的表情串含义/s^_^ 微笑 /f_ 困惑 /cT_T 哭泣/z^_~ 眨眼
函数原型规定为 int ConvertEmoji(char **dst,const char *src); 其中dst是指向转换后的带有表情串的字符串指针的指针src是指向需要转换的原始字符串指针。函数返回的是转换后的字符串的长度。 特别说明转换后的字符串长度长短不一所以需要在函数中根据需要给dst所指向的转换目标字符串分配内存。函数调用结束后需自行释放该内存。 提交时只提交ConvertEmoji()及其调用的自定义函数的实现代码。
#include stdio.h //注意原内容h后面多打了空格需要删除
#include stdlib.h
#include string.h#define N 64int ConvertEmoji(char **dst, const char *src);int main()
{char str[N], *p NULL;int len, i 0;fgets(str, N, stdin);while(i strlen(str)) {if (str[i]\n) { str[i]\0;break;}i;}lenConvertEmoji(p, str);printf((%d)%s\n, len, p);free(p);return 0;
}
二、设计步骤
这道题的核心思路与“删除子串”一题大同小异都是通过字符串的移动实现对其的修改操作。我们引入两个子函数分别用来计算操作后字符串的长度和对字符串进行唯一操作。OperateArr()函数通用。
题目中有一句话特别说明转换后的字符串长度长短不一所以需要在函数中根据需要给dst所指向的转换目标字符串分配内存。函数调用结束后需自行释放该内存。
事实上并不需要如果我们将dst作为p对应的二级指针并在子函数中释放了内存那么p字符串就无法正常输出了而主程序的最后free(p)会释放p的内存空间因此不会出现内存泄漏的问题。
该题第六个测试点是{\n}如果用strlen()函数会返回1而OJ系统认为其长度为0因此我们在程序中添加一个判断条件。
代码实现
#define EmojiSize 3 //Emoji字符串的长度
#define BaseSize 2 //转义字符串的长度
const int deltSize EmojiSize - BaseSize; //差值int ConvertEmoji(char **dst, const char *src);
int Count_tar(char base[],const char *p);
void OperateArr(char *Arr,int len,int opt_len);
int ConvertEmoji(char **dst, const char *src)
{int i,j,h;int len strlen(src);char bas_ch[5] {s,f,c,z}; //在字符串中查找的对象char bas_tar[4][4] {^_^,_,T_T,^_~}; //用于替换的子串int dstSize len deltSize * Count_tar(bas_ch,src);char *temp (char *)malloc(dstSize * sizeof(char));if(*src \n) //别问问就是6.out{**dst \0;return 0;}strcpy(*dst,src); //拷贝int flag 0; //已转换的次数i 0;while(i dstSize){if(*(*dsti) /){for(j 0;j 4;j){if(*(*dsti1) bas_ch[j]){flag;OperateArr((*dsti2),lenflag-i-2,deltSize); //使操作部分后面的子字符串位移for(h 0;h EmojiSize;h) //字符串替换{*(*dstih) bas_tar[j][h];}break;}}}i;}return dstSize;
}int Count_tar(char base[],const char *p) //计算操作后的字符串长度
{int i 0,j,count 0;while(*(pi) ! \0){if(*(pi) /){for(j 0;j 4;j){if(*(pi1) base[j]){count;break;}}}i;}return count;
}void OperateArr(char *Arr,int len,int opt_len) //字符串位移函数
{int i,j;char temp;for(i 0;i opt_len;i){temp *(Arr len - 1);for(j len - 1;j 0;j--){*(Arrj) *(Arr j - 1);}*Arr temp;}
}总结
NWAFU 2021阶段二 D