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;
 | 
						|
    }
 | 
						|
} |