#include <iostream>
#include <stdlib.h>
//#include <algorithm> using namespace std; void stringZip( const char* pInputStr, long lInputLen, char* pOutputStr )
{
if( !pInputStr || lInputLen <= 1 || !pOutputStr )
return;
memset( pOutputStr, 0, lInputLen ); char cValue = *pInputStr;//重复字母对比值
long lCount = 0;//单一字符重复字母个数
int iIndex = 0;//pInputStr迭代位置
int iCur = 0;//pOutputStr当前指针偏移
int iNumLen = 0;//压缩字母的个数长度
char buf[16];//字母长度缓存 while( lInputLen-- )
{
if( cValue == *( pInputStr + iIndex++ ) )
{//遇到重复字符
lCount++;//
}
else
{
if( lCount > 1 )
{//重复字符
memset( buf, 0, 16 );
itoa( lCount, buf, 10 );
strcat( pOutputStr, buf );
iNumLen = strlen( buf );
} iCur += iNumLen;
*( pOutputStr + iCur ) = cValue;//append字符
iCur++; cValue = *(pInputStr + iIndex - 1);//取下一个待比较的字符 //重新计算位置
iIndex--;
lInputLen++; //重置计数器
iNumLen = 0;
lCount = 0;
}
}
} char* stringUnzip( const char* pStrIn )
{//
if( !pStrIn || !strlen( pStrIn ) )
return NULL; long lLen = strlen( pStrIn );
const int INCREMENT = 1024; //先将结果字符串设置为输入字符串的5倍大小
long lCurNums = 5 * lLen * sizeof( char );
char* pStrOut = (char*)malloc( lCurNums ); if( !pStrOut )
return NULL; memset( pStrOut, 0, lCurNums ); long lNum = 0;//重复字母个数
int iNumLen = 0;//重复字母长度
int iCur = 0;//结果集当前指针偏移
char numBuf[16];//用于计算数字长度
char cValue; //临时字符值
const long constLen = lLen;
long lIndex = constLen - lLen;//pStrIn的字符串偏移值 int i;
while( lIndex < constLen )
{
lIndex = constLen - lLen;// lNum = atoi( ( pStrIn + lIndex ));//字符个数 if( lNum > 0 )
{//字符个大于1
if( iCur + lNum >= lCurNums -1 )
{//空间不足
lCurNums += INCREMENT; pStrOut = (char*)realloc( pStrOut, lCurNums ); if( !pStrOut )
return NULL;
} memset( numBuf, 0, 16 );
itoa( lNum, numBuf, 10 ); iNumLen = strlen( numBuf );//取数字长度
cValue = *( pStrIn + lIndex + iNumLen );//取压缩的字符 for( i = 0; i < lNum; i++ )//还原压缩的字符
{
*( pStrOut + iCur++ ) = cValue;
} }
else
{//未压缩的单一字符
if( iCur >= lCurNums -1 )
{//空间不足
lCurNums += INCREMENT; pStrOut = (char*)realloc( pStrOut, lCurNums ); if( !pStrOut )
return NULL;
} *(pStrOut + iCur++ ) = *( pStrIn + lIndex + iNumLen );
} lLen = lLen - iNumLen - 1;//计算偏移值
iNumLen = 0; } return pStrOut; } int main( int argc, char* argv[] )
{
char* pInStr = "aaaabasdfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccddddeeeadfaadfa";
int iLen = strlen( pInStr ) + 1; char* pOutStr = (char*)malloc( iLen );
memset( pOutStr, 0, iLen ); //压缩字符
stringZip( pInStr, iLen, pOutStr );
puts( pOutStr ); //还原压缩的字符
char* pUnzipStr = stringUnzip( pOutStr );
puts( pUnzipStr );     free( pUnzipStr );
pUnzipStr = NULL; return 0;
}

C字符串压缩算法的更多相关文章

  1. JustOj 1415: 字符串解压

    题目描述 豆豆非常调皮,总喜欢把一样的东西摆在一起,然后用神奇的猫爪功把他们揉成一团. 比如一堆A,就会被揉成个数+A. 这就是豆豆的字符串压缩算法了. 比如给豆豆一个字符串:ABBCCCDDDDEE ...

  2. 字符串解压缩类库(zip、GZIP、QuickLz、snappy、lzf、jzlib)介绍

    1.ZIP. GZIP  计算机文件压缩算法,JDK中java.util.zip.*中实现.主要包括ZipInputStream/ ZipOutputStream.GZipInputStream/Zi ...

  3. 字符串压缩(一)之ZSTD

    前言 最近项目上有大量的字符串数据需要存储到内存,并且需要储存至一定时间,于是自然而然的想到了使用字符串压缩算法对"源串"进行压缩存储.由此触发了对一些优秀压缩算法的调研. 字符串 ...

  4. 深入剖析Redis RDN持久化机制

    rdb是redis保存内存数据到磁盘数据的其中一种方式(另一种是AOF).Rdb的主要原理就是在某个时间点把内存中的所有数据的快照保存一份到磁盘上.在条件达到时通过fork一个子进程把内存中的数据写到 ...

  5. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  6. .NET基础拾遗(3)字符串、集合和流

    Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...

  7. LZ77压缩算法编码原理详解(结合图片和简单代码)

    前言 LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年.LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77.鉴于其在数据压缩领域的地位,本文将结合图 ...

  8. Java 压缩字符串

    1.引言 最近在做项目中,平台提供一个http服务给其他系统调用,然后我接收到其他系统的json格式的报文后去解析,然后用拿到的数据去调用corba服务,我再把corba的返回值封装完成json字符串 ...

  9. C# 压缩与解压字符串(面试题)

    /* * 题目:压缩字符串.如“abbcccddddeef”,压缩成“a1b2c3d4e2f1” * 解题: 这个题目也是面试常见的题目.看似很简单,其实暗藏杀机.一般的想法就是,一边遍历,一边计数, ...

随机推荐

  1. codevs 1106 篝火晚会

    不要问我为什么WA这么多次... #include<iostream> #include<cstdio> #include<cstring> #include< ...

  2. DbgPrint输出格式 Unicodestring

    DbgPrint输出格式 Unicodestring  1) 直接打印字符串. DbgPrint("Hello World!"); 2) 空结尾的字符串,你可以用普通得C语法表示字 ...

  3. ti processor sdk linux am335x evm setup.sh hacking

    #!/bin/sh # # ti processor sdk linux am335x evm setup.sh hacking # 说明: # 本文主要对TI的sdk中的setup.sh脚本进行解读 ...

  4. busybox filesystem ifup

    /******************************************************************** * busybox filesystem ifup * 声明 ...

  5. Java [Leetcode 206]Reverse Linked List

    题目描述: Reverse a singly linked list. 解题思路: 使用递归或者迭代的方法. 代码如下: 方法一:递归 /** * Definition for singly-link ...

  6. liunx环境下的mysql数据库配置文件my.conf内的参数含义

    [client]port = 3306socket = /tmp/mysql.sock [mysqld]port = 3306socket = /tmp/mysql.sock basedir = /u ...

  7. Jquery获取第一个子元素

    如获取id为divId的div下的第一个子div $("#divId").children("div").get(0) 但得到的是一个dom对象,如果要得到Jq ...

  8. .NET Framework个版本说明

    .NET Framework .NET版本 1.0 1.1 2.0 3.0 3.5 4.0 4.5 完整版本 1.0.3705.0 1.1.4322.573 2.0.50727.42 3.0.4506 ...

  9. web安全测试&渗透测试之sql注入~~

    渗透测试概念: 详见百度百科 http://baike.baidu.com/link?url=T3avJhH3_MunEIk9fPzEX5hcSv2IqQlhAfokBzAG4M1CztQrSbwsR ...

  10. uC/OS-II 移植笔记

    用过51.AVR.Freescale.STM32,但是写程序一直没有用过实时操作系统,一是因为写的项目不大,二是不太想去看手册学东西.现在写的项目也算比较大,因为需要,所以就学一下,这样也不至于每次的 ...