表情串转换

前言

NWAFU 2021阶段二 D


一、题目描述

题目描述

在一个字符串中,设置了由‘/’前导字符和某些特定字母构成的转义子字符串,如“/s”、“/f”、“/c”等用于表示特殊表情符号。现要求编写一个函数,将给定字符串中的转义字符串转换为表情字符串,同时其他字符保持不变,然后返回转换后的字符串首地址。需要转义的符号串仅有以下4个:

原字符串中的特殊符号子串 要转成的表情串 含义
/s ^_^    微笑  
/f @_@    困惑  
/c T_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 64

int 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++;
    }
    len=ConvertEmoji(&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(*(*dst+i) == '/')
        {
            for(j = 0;j < 4;j++)
            {
                if(*(*dst+i+1) == bas_ch[j])
                {
                    flag++;
                    OperateArr((*dst+i+2),len+flag-i-2,deltSize); //使操作部分后面的子字符串位移
                    for(h = 0;h < EmojiSize;h++)        //字符串替换
                    {
                        *(*dst+i+h) = bas_tar[j][h];
                    }
                    break;
                }
            }
        }
        i++;
    }
    return dstSize;
}

int Count_tar(char base[],const char *p)   //计算操作后的字符串长度
{
    int i = 0,j,count = 0;
    while(*(p+i) != '\0')
    {
        if(*(p+i) == '/')
        {
            for(j = 0;j < 4;j++)
            {
                if(*(p+i+1) == 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--)
        {
            *(Arr+j) = *(Arr + j - 1);
        }
        *Arr = temp;
    }
}

总结

NWAFU 2021阶段二 D

相关推荐

  1. 表情转换

    2023-12-29 08:36:03       40 阅读
  2. [Verilog]用Verilog实现转换/并转换

    2023-12-29 08:36:03       35 阅读
  3. 关于python的字节与字符串的转换

    2023-12-29 08:36:03       8 阅读
  4. jEasyUI 转换 HTML 表格为数据网格

    2023-12-29 08:36:03       8 阅读
  5. 将一字符串中的小写字母转换为大写

    2023-12-29 08:36:03       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 08:36:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 08:36:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 08:36:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 08:36:03       20 阅读

热门阅读

  1. Ubuntu 2x.04 编译FFmpeg 脚本

    2023-12-29 08:36:03       38 阅读
  2. 高阶组件和高阶函数是什么

    2023-12-29 08:36:03       36 阅读
  3. flutter学习-day22-使用GestureDetector识别手势事件

    2023-12-29 08:36:03       30 阅读
  4. 力扣:56. 合并区间(贪心)

    2023-12-29 08:36:03       33 阅读
  5. LeetCode75| 队列

    2023-12-29 08:36:03       34 阅读
  6. 编程笔记 html5&css&js 011 HTML页面划分

    2023-12-29 08:36:03       27 阅读
  7. 策略模式(及案例)

    2023-12-29 08:36:03       26 阅读
  8. SQL 解析 — 如何轻松实现新增语句

    2023-12-29 08:36:03       28 阅读