C语言:字符串的解压缩

字符串压缩
输入AAABBCCCCDD输出3A2B4C2D
字符串解压
输入:A3B10CB输出ABBBCCCCCCCCCCB

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

void compressString(char* str) {    //压缩
    int len = strlen(str);    
    if (len == 0) {
        return;
    }

    int count = 1;    //记录相同字符的数量
    char currentChar = str[0];         //把当前字符串放到一个str数组里

    for (int i = 1; i <= len; i++) {
        if (str[i] == currentChar) {
            count++;
        } else {
            printf("%d%c", count, currentChar);     //遇到不同的字符打印计数和当前字符
            count = 1;
            currentChar = str[i];
        }
    }
}

void decompressString(char* str) {    //解压
    int len = strlen(str);
    if (len == 0) {
        return;
    }

    int i = 0;
    while (i < len) {
        int count = 0;
        while (isdigit(str[i])) {
            count = count * 10 + (str[i] - '0');
            i++;
        }
        for (int j = 0; j < count; j++) {
            printf("%c", str[i]);
        }
        i++;
    }
}
int main() {
    char str[100];

    printf("请输入要压缩的字符串:");
    scanf("%s", str);
    printf("压缩后的字符串为:");
    compressString(str);
    printf("\n");

    printf("请输入要解压缩的字符串:");
    scanf("%s", str);
    printf("解压缩后的字符串为:");
    decompressString(str);
    printf("\n");

    return 0;
}
-------------------------------------------------------------
// 另一种写法
字符串压缩

输入   AAABBCCCCDD
输出   3A2B4C2D

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

char * decode(char * src){
    char * ret = (char *)malloc(sizeof(char) * 100);
    memset(ret, 0, sizeof(char) * 100);//以字节为单位
    char ch = src[0]; //记忆要填入的字符
    int cnt = 1; //统计每个字符出现的个数
    for(int i = 1; src[i] != '\0'; ++i){
        if(src[i] == src[i - 1]){
            cnt++;
        }
        else{ //向字符数组末尾追加一个整数和字符
            sprintf(ret + strlen(ret), "%d%c", cnt, ch);
            cnt = 1;
            ch = src[i];
        }
    }
    sprintf(ret + strlen(ret), "%d%c", cnt, ch);
    return ret;
}

int main(){
    char src[100] = {0};
    gets(src);
    char * p = decode(src);
    puts(p);
    free(p);
    p = NULL;
    return 0;
}

字符串解压

输入: A3B10CB
输出   ABBBCCCCCCCCCCB
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char * encode(char * src){
    char * ret = (char *)malloc(sizeof(char) * 10000);
    memset(ret, 0, sizeof(char) * 10000);//以字节为单位
    int num = 0;
    for(int i = 0; src[i] != '\0'; ++i){
        if(isdigit(src[i])){
            num = num * 10 + (src[i] - '0');
        }
        else{
            if(num == 0){//字符前没有数字 只放一个字符
                ret[strlen(ret)] = src[i];
            }
            else{
                //for(int j = 0; j < num; ++j){
                    //ret[strlen(ret)] = src[i];
                //}
                memset(ret + strlen(ret), src[i], num);
                //初始化指定字符 只有字符数组可以用memset
                //所有数组都支持初始化0
            }
            num = 0;
        }
    }
    return ret;
}

int main(){
    char src[100] = {0};
    gets(src);
    char * p = encode(src);
    puts(p);
    free(p);
    p = NULL;
    return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值