105 lines
2.1 KiB
C
105 lines
2.1 KiB
C
|
#include<stdio.h>
|
||
|
#include<stdlib.h>
|
||
|
#include<string.h>
|
||
|
#include<ctype.h>
|
||
|
|
||
|
#define LINE_SIZE 150
|
||
|
#define MAX_RLEN 50
|
||
|
|
||
|
char* read_line();
|
||
|
char* runLengthCod(char* line);
|
||
|
char* encode(char* src);
|
||
|
char* decode(char* line);
|
||
|
|
||
|
int main(){
|
||
|
char* line = read_line();
|
||
|
//char* compressedline = runLengthCod(line);
|
||
|
char* compressedline = encode(line);
|
||
|
char* decompressedline = decode(compressedline);
|
||
|
printf("line = %s\n", line);
|
||
|
printf("encoded line = %s\n", compressedline);
|
||
|
printf("decoded line = %s\n", decompressedline);
|
||
|
|
||
|
free(line); free(compressedline);
|
||
|
free(decompressedline);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
char* encode(char* src)
|
||
|
{
|
||
|
int rLen;
|
||
|
char count[MAX_RLEN];
|
||
|
int len = strlen(src);
|
||
|
|
||
|
char* dest = (char*)malloc(sizeof(char) * (len * 2 + 1));
|
||
|
|
||
|
int i, j = 0, k;
|
||
|
char ch;
|
||
|
|
||
|
for (i = 0; i < len; i++) {
|
||
|
//dest[j++] = src[i];
|
||
|
|
||
|
ch = src[i];
|
||
|
rLen = 1;
|
||
|
while (i + 1 < len && src[i] == src[i + 1]) {
|
||
|
rLen++;
|
||
|
i++;
|
||
|
}
|
||
|
sprintf(count, "%d", rLen);
|
||
|
|
||
|
for (k = 0; *(count + k); k++, j++) {
|
||
|
dest[j] = count[k];
|
||
|
}
|
||
|
dest[j++]=ch;
|
||
|
|
||
|
}
|
||
|
|
||
|
dest[j] = '\0';
|
||
|
return dest;
|
||
|
}
|
||
|
|
||
|
char* decode(char* line){
|
||
|
char* result = (char*)malloc(LINE_SIZE);
|
||
|
memset(result,0,LINE_SIZE);
|
||
|
int enlen = strlen(line);
|
||
|
int count=0;
|
||
|
int j=0;
|
||
|
|
||
|
for(int i=0; i<enlen; i++){
|
||
|
|
||
|
if(isdigit(line[i])){
|
||
|
count = count*10 + line[i]-'0';
|
||
|
}else{
|
||
|
while(count > 0){
|
||
|
result[j] = line[i];
|
||
|
j++;
|
||
|
count--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
char* read_line(){
|
||
|
char* line=(char*)malloc(LINE_SIZE);
|
||
|
|
||
|
memset(line,0,LINE_SIZE);
|
||
|
|
||
|
char* r = fgets(line,LINE_SIZE,stdin);
|
||
|
|
||
|
if(r==NULL||strlen(line)==1){
|
||
|
free(line);
|
||
|
return 0;
|
||
|
}
|
||
|
else if (strlen(line)==LINE_SIZE-1 && line[LINE_SIZE]!='\n')
|
||
|
{
|
||
|
printf("string is too long\n");
|
||
|
}
|
||
|
else{
|
||
|
int len = strlen(line);
|
||
|
line[len-1] = '\0';
|
||
|
return line;
|
||
|
}
|
||
|
}
|