酷酷小松鼠 2023-02-23 12:34 采纳率: 100%
浏览 96
已结题

字符串压缩指针函数数组

标题:字符串压缩
问题描述:有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。

主程序如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *compress(char *src);
int main()
{
    char src[100];
    scanf("%s",src);

    char *ps = compress(src);
    
    puts(ps);
    return 0;
}

请设计一个程序,采用该压缩方法对字符串压缩并输出。请编写一个函数compress,采用该压缩方法对字符串src进行压缩。函数定义如下:
char *compress(char *src);
返回值:
指向压缩后的字符串数据
参数:
src:输入/输出参数,输入表示待压缩字符串,输出表示压缩后的字符串

注意:函数声明已包含在主程序中,不需要自己定义。只需要提交自定义的函数代码。

主函数输入说明:
输入第一行为源字符串src(长度小于100),该字符串只包含大小写字母。
主函数输出说明:
输出一个数据,表示压缩后的字符串。

  • 写回答

3条回答 默认 最新

  • boonion 2023-02-23 15:53
    关注

    贴过去试一试效果呢

    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    char *compress(char *src);
    
    int main()
    {
        char src[100];
        scanf("%s",src);
     
        char *ps = compress(src);
        
        puts(ps);
        return 0;
    }
    
    char *compress(char *src)
    {
        char oldch = '\0';//前一个字符
        char newch = '\0';//最新字符
        char *newsrc = src;//在原来src字符串上面填充压缩后的字符串
        char *returnsrc = src;//返回字符串到首地址
        int count = 0 ;//记录连续次数
            
        oldch  = *src;//第一个字符串
    
        while(*src != '\0')
        {
            newch = *src;
            if(newch == oldch)
            {
                count++    ;//前一个字符与最新字符相同 计数加一    
            }
            else
            {    //不相同开始统计计算
                if(count < 3)
                {
                    if(count == 1)//计算为1 在新到字符串上填一个
                    {
                        *newsrc=oldch;
                        newsrc++;
                    }
                    else if(count == 2)//计数为2填两个
                    {
                        *newsrc=oldch;
                        newsrc++;
                        *newsrc=oldch;
                        newsrc++;
                    }
    
                                    
                }
                else//计数大于3 
                {
                    *newsrc=oldch;//填充旧字符和压缩的数值
                    newsrc++;
                    if(count /10)//计算大于10的情况
                    {
                        *newsrc='0'+count/10;
                        newsrc++;
                    }
                    *newsrc='0'+count%10;
                    newsrc++;
                }
                
                count = 1;//当前新字符计数1
                oldch = newch;
            }
            
            src++;    //字符串向后滚动
                
        }
    
        if(count < 3)//填充最后字符计算情况 如 abcddddd, 最后d也要统计
        {
            if(count == 1)
            {
                *newsrc=oldch;
                newsrc++;
            }
            else if(count == 2)
            {
                *newsrc=oldch;
                newsrc++;
                *newsrc=oldch;
                newsrc++;
            }
    
                                    
        }
        else 
        {
            *newsrc=oldch;//填充旧字符和压缩的数值
            newsrc++;
            if(count /10)
            {
                *newsrc='0'+count/10;
                newsrc++;
            }
            *newsrc='0'+count%10;
            newsrc++;
        }
    
        //截断字符串,丢弃原来没有压缩的字符串
        *newsrc = '\0';
    
    
        return returnsrc;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月6日
  • 已采纳回答 2月26日
  • 请提交代码 2月23日
  • 创建了问题 2月23日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分