C字符串壓縮算法
#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;}</pre>