字符串压缩
输入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;
}