導航:首頁 > 源碼編譯 > c語言字元串壓縮演算法

c語言字元串壓縮演算法

發布時間:2022-05-09 08:54:58

① c語言字元串解壓 機考系統說是編譯錯誤 求助

我在vs2012上編譯 運行 都是正確的,就是gets有個編譯警告。

② c語言的字元串壓縮演算法問題

把ToString前面的int給去了,再確認下ToString這個函數是不是定義了(我好像沒看見這東西定義了)

③ c語言壓縮文本文件 求解答

#include"stdio.h"
#include"string.h"
#include"malloc.h"


#defineMOD_ADLER65521
#defineHASHMAX1000
#defineMAX_INT9999999//最大讀取數字為99999999
#defineCHARBUFLEN40960
#defineDECOMPRESSINITLEN1024

structstringInfo
{
intNo;//字元串出現的次序
char*str;//字元串
structstringInfo*next;//下一節點
}*strTable[HASHMAX];//用於壓縮
intisCompress;
char**strTableDe;//解壓縮表,用於解壓縮
longdeTableLen;//解壓縮表長度
longcurStrNum;//目前的字元串數量

//程序初始化
voidinit()
{
inti;
curStrNum=1;
isCompress=1;//壓縮模式,等於0時解壓縮
if(isCompress)
{
for(i=0;i<HASHMAX;i++)strTable[i]=NULL;
deTableLen=0;
strTableDe=NULL;
}
else
{
deTableLen=DECOMPRESSINITLEN;
strTableDe=(char**)malloc(deTableLen*sizeof(char*));
for(i=0;i<deTableLen;i++)strTableDe[i]=NULL;
}
}
//重新申請內存
voidReMallocDeTable()
{
deTableLen<<=1;
strTableDe=(char**)realloc(strTableDe,deTableLen*sizeof(char*));
}

//程序結束,釋放內存
voidover()
{
inti;
structstringInfo*pNext,*pDel;

for(i=0;i<HASHMAX;i++)
{
pNext=strTable[i];
while(pNext)
{
free(pNext->str);
pDel=pNext;
pNext=pNext->next;
free(pDel);
}
}
if(strTableDe)
{
for(i=0;i<curStrNum;i++)
{
//printf("%d %s ",i,strTableDe[i]);
free(strTableDe[i]);
}
free(strTableDe);
}
}

//adler32校驗和演算法
unsignedlongadler32(unsignedchar*data,size_tlen)
{
unsignedlonga=1,b=0;
size_tindex;

for(index=0;index<len;++index)
{
a=(a+data[index])%MOD_ADLER;
b=(b+a)%MOD_ADLER;
}
return(b<<16)|a;
}

//求字元串的Hash,實現快速查找,這里用的是adler32演算法,可以使用其它任何hash方法
unsignedlongHash(constchar*str)
{
returnadler32((unsignedchar*)str,strlen(str))%HASHMAX;
}

//復制新字元串
char*NewStr(constchar*str)
{
char*r=(char*)malloc(strlen(str)+1);
strcpy(r,str);
returnr;
}

//取得字元串出現的次序
intgetStrPos(constchar*str)
{
unsignedlonghash;
structstringInfo*pFirst,*pNext,*pNew;

hash=Hash(str);
pNext=pFirst=strTable[hash];
while(pNext)
{
if(strcmp(pNext->str,str)==0)returnpNext->No;
pNext=pNext->next;
}

//沒有找到匹配的字元串
pNew=(structstringInfo*)malloc(sizeof(structstringInfo));
pNew->next=NULL;
pNew->No=curStrNum++;
pNew->str=NewStr(str);
if(pFirst==NULL)strTable[hash]=pNew;
else
{
pNext=pFirst;
while(pNext->next)pNext=pNext->next;
pNext->next=pNew;
}
return-1;
}

//讀取字元串,字元串以空格為結束符
//返回負數的絕對值是讀取的是字元串長度,正數為讀取的數字
intReadStr(char*out,constchar*in)
{
char*po,*pn;
constchar*pi;
intr;

po=out;
pi=in;
while(('a'<=*pi&&*pi<='z')||('A'<=*pi&&*pi<='Z')||('0'<=*pi&&*pi<='9'))
*po++=*pi++;//只復制大小寫字母和數字
*po=0;

//試著轉化為純數字
r=0;
pn=out;
while('0'<=*pn&&*pn<='9')
{
if(r>MAX_INT)break;
r*=10;
r+=*pn++-'0';
}
if(*pn)returnout-po;//未成功轉化為數字
elsereturn(r&0x7FFFFFF)|(((po-out)&0xF)<<27);
}

voidmain()
{
charreadFileBuf[CHARBUFLEN],readStrBuf[CHARBUFLEN];
char*prfb;
intnum;
FILE*fpr,*fpw;

fpr=fopen("source.txt","r");//輸入文件
fpw=fopen("object.txt","w");//輸出文件


if(fpr==NULL||fpw==NULL)return;

init();
while(!feof(fpr))
{
if(fgets(readFileBuf,CHARBUFLEN-1,fpr)==NULL)break;
prfb=readFileBuf;
while(*prfb)
{
num=ReadStr(readStrBuf,prfb);
if(num==0)fputc(*prfb++,fpw);//沒有讀取成功
elseif(num>0)//讀入數字
{
prfb+=(num>>27)&0xF;//移動讀取的位數
if(isCompress)fprintf(fpw,"0%d",num&0x7FFFFFF);//壓縮模式寫入數字,前面添加個數字0
else
{
num&=0x7FFFFFF;
if(num==0)//如果讀到數字0
{
prfb+=1;
num=ReadStr(readStrBuf,prfb);//讀取下一格數據串
if(num>0)
{
prfb+=(num>>27)&0xF;//移動讀取的位數
fprintf(fpw,"%d",num&0x7FFFFFF);
}
elsefprintf(fpw,"0",num&0x7FFFFFF);//下一個不是數字
}
elseif(num<curStrNum)fprintf(fpw,"%s",strTableDe[num]);//解壓模式寫入字元串
else
{
printf("Error:%d,%d ",num,curStrNum);
fprintf(fpw,"%d",num);//num大於已知的字元串數量,寫入數字
}
}
}
else
{
num=-num;
prfb+=num;//移動讀取的位數
if(isCompress)
{
num=getStrPos(readStrBuf);
if(num<0)fprintf(fpw,"%s",readStrBuf);//未出現過的字元串
elsefprintf(fpw,"%d",num);//寫入位置
}
else
{
fprintf(fpw,"%s",readStrBuf);
if(curStrNum>=deTableLen)ReMallocDeTable();//解壓表長度不夠,重新申請空間
strTableDe[curStrNum++]=NewStr(readStrBuf);//加入解壓表
}
}
}
}
if(isCompress)printf("Compresssuccessful! ");
elseprintf("DecompressSuccessful! ");
over();
}

④ 如何用C語言實現數據壓縮

首先選擇一個壓縮演算法

然後按照演算法實現壓縮代碼,調用介面就可以
常見的 可以使用哈夫曼編碼壓縮,或者使用開源的壓縮代碼,比如lzo, gzip, lzma等等。

⑤ 急求lzw演算法的英文文本壓縮C語言源代碼!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>//用來計算壓縮的時間
using namespace std;

//定義常數
const int MAX = 1000003;//最大code數,是一個素數,求模是速度比較快
const int ascii = 256; //ascii代碼的數量
const int ByteSize = 8; //8個位元組

struct Element//hash表中的元素
{
int key;
int code;
Element *next;
}*table[MAX];//hash表

int hashfunction(int key)//hash函數
{
return key%MAX;
}
void hashinit(void)//hash表初始化
{
memset(table,0,sizeof(table));
}
void hashinsert(Element element)//hash表的插入
{
int k = hashfunction(element.key);
if(table[k]!=NULL)
{
Element *e=table[k];
while(e->next!=NULL)
{
e=e->next;
}
e->next=new Element;
e=e->next;
e->key = element.key;
e->code = element.code;
e->next = NULL;
}
else
{
table[k]=new Element;
table[k]->key = element.key;
table[k]->code = element.code;
table[k]->next = NULL;
}
}
bool hashfind(int key,Element &element)//hash表的查找
{
int k = hashfunction(key);
if(table[k]!=NULL)
{
Element *e=table[k];
while(e!=NULL)
{
if(e->key == key)
{
element.key = e->key;
element.code = e->code;
return true;
}
e=e->next;
}
return false;
}
else
{
return false;
}
}
void compress(void)//壓縮程序
{
//打開一個流供寫入
FILE *fp;
fp = fopen("result.dat", "wb");

Element element;
int used;
char c;
int pcode, k;

for(int i=0;i<ascii;i++)
{
element.key = i;
element.code = i;
hashinsert(element);
}
used = ascii;

c = getchar();
pcode = c;
while((c = getchar()) != EOF)
{
k = (pcode << ByteSize) + c;
if(hashfind(k, element))
pcode = element.code;
else
{
//cout<<pcode<<' ';
fwrite(&pcode, sizeof(pcode), 1, fp);
element.code = used++;
element.key = (pcode << ByteSize) | c;
hashinsert(element);
pcode = c;
}
}
//cout<<pcode<<endl;
fwrite(&pcode, sizeof(pcode), 1, fp);

}
int main(void)
{
int t1,t2;

//欲壓縮的文本文件
//freopen("input.txt","r",stdin);
freopen("book5.txt","r",stdin);

t1=time(NULL);
hashinit();
compress();
t2=time(NULL);

cout<<"Compress complete! See result.dat."<<endl;
cout<<endl<<"Total use "<<t2-t1<<" seconds."<<endl;

⑥ 急求lempel-ziv壓縮演算法c語言

Lempel-Ziv壓縮演算法之原理
在LZ壓縮演算法的背後是使用RLE演算法用先前出現的相同位元組序列的引用來替代。
簡單的講,LZ演算法被認為是字元串匹配的演算法。例如:在一段文本中某字元串經常出現,並且可以通過前面文本中出現的字元串指針來表示。當然這個想法的前提是指針應該比字元串本身要短。
例如,在上一段短語「字元串」經常出現,可以將除第一個字元串之外的所有用第一個字元串引用來表示從而節省一些空間。
一個字元串引用通過下面的方式來表示:
1.唯一的標記
2.偏移數量
3.字元串長度
由編碼的模式決定引用是一個固定的或變動的長度。後面的情況經常是首選,因為它允許編碼器用引用的大小來交換字元串的大小(例如,如果字元串相當長,增加引用的長度可能是值得的)。
Lempel-Ziv壓縮演算法之實現
使用LZ77的一個問題是由於演算法需要字元串匹配,對於每個輸入流的單個位元組,每個流中此位元組前面的哪個位元組都必須被作為字元串的開始從而盡可能的進行字元串匹配,這意味著演算法非常慢。
另一個問題是為了最優化壓縮而調整字元串引用的表示形式並不容易。例如,必須決定是否所有的引用和非壓縮位元組應該在壓縮流中的位元組邊界發生。
基本壓縮庫使用一個清晰的實現來保證所有的符號和引用是位元組對齊的,因此犧牲了壓縮比率,並且字元串匹配程序並不是最優化的(沒有緩存、歷史緩沖區或提高速度的小技巧),這意味著程序非常慢。
另一方面,解壓縮程序非常簡單。
一個提高LZ77速度的試驗已經進行了,這個試驗中使用數組索引來加速字元串匹配的過程。然而,它還是比通常的壓縮程序慢。

⑦ C語言求助:請編寫一個字元串壓縮程序,將字元串中連續出席的重復字母進行壓縮,並輸出壓縮後的字元串。

#include <stdio.h>

void stringZip(const char

*pInputStr, long lInputLen, char *pOutputStr)

{ int n=1;

char c,*p1=pInputStr,*p2=pOutputStr;

while(*p1)

{

c=*(p1++);

while(*p1==c){n++;p1++;}

if(n>1)

{

if(n>999){*(p2++)=48+n/1000; n/=10;}

if(n>99){*(p2++)=48+n/100; n/=10;}

if(n>9){*(p2++)=48+n/10; n/=10;}

*(p2++)=48+n;

}

*(p2++)=c;

n=1;

}

*p2='';

}

void main()

{ char s1[200],s2[200];

gets(s1);

stringZip(s1,strlen(s1),s2);

puts(s2);

}

⑧ c語言編寫文件壓縮程序的設計思路 急啊

這個,我覺得應該找一個成熟的庫,看需求了,比如Huffman演算法的,或者直接開源的zlib之類的,然後你的c調用庫的API介面,就可以了。其實你的c代碼只是對庫的功能的一個簡單封裝,最多提供一些帶壓縮的文件從哪裡來,要放到哪裡去這些。數據壓縮是一個很大的課題,看你的需求了。

⑨ c語言——把abbccc壓縮成a2b3c



題目描述(40分):通過鍵盤輸入一串小寫字母(a~z)組成的字元串。
請編寫一個字元串壓縮程序,將字元串中連續出席的重復字母進行壓縮,
並輸出壓縮後的字元串。

壓縮規則:1.僅壓縮連續重復出現的字元。比如字元串"abcbc"由於無連續重復字元,壓縮後的字元串還是"abcbc".
2.壓縮欄位的格式為"字元重復的次數+字元"。例如:字元串"xxxyyyyyyz"壓縮後就成為"3x6yz"

要求實現函數:voidstringZip(constchar*pInputStr,longlInputLen,char*pOutputStr);
【輸入】pInputStr:輸入字元串lInputLen:輸入字元串長度
【輸出】pOutputStr:輸出字元串,空間已經開辟好,與輸入字元串等長;
【注意】只需要完成該函數功能演算法,中間不需要有任何IO的輸入輸出

示例輸入:「cccddecc」輸出:「3c2de2c」
輸入:「adef」輸出:「adef」
輸入:「pppppppp」輸出:「8p」
*/

#include<stdio.h>

#defineLEN1000

voidstringZip(constchar*pInputStr,longlInputLen,char*pOutputStr)
{
charc;
intcount=1,index=0;
inti=0;

c=pInputStr[0];
for(i=1;i<lInputLen;i++)
{
if(pInputStr[i]==c)
{
count++;
}
else
{
if(count==1)
{
pOutputStr[index++]=c;
}
else
{
pOutputStr[index++]=count+'0';
pOutputStr[index++]=c;
}
count=1;
c=pInputStr[i];
}
}

if(c!=pInputStr[index-1])
{
if(count==1)
{
pOutputStr[index++]=c;
}
else
{
pOutputStr[index++]=count+'0';
pOutputStr[index++]=c;
}
}

pOutputStr[index]='';
}

intmain()
{
charpInputStr[LEN],pOutputStr[LEN];
scanf("%s",pInputStr);

stringZip(pInputStr,strlen(pInputStr),pOutputStr);
printf("%s ",pOutputStr);
system("pause");
return0;
}

這個的原題應該是上面的注釋部分,我已經測試過了,DEVCPP環境下測試的,你看看有什麼疑問可以繼續追問,望採納!

閱讀全文

與c語言字元串壓縮演算法相關的資料

熱點內容
命令行截圖軟體 瀏覽:732
程序員加班多 瀏覽:123
android設置view的背景 瀏覽:684
u盤加密工具哪個好 瀏覽:571
php生成html模板引擎 瀏覽:26
如何設置app封殺 瀏覽:823
手機將照片弄成壓縮包 瀏覽:221
卡聯購卡盟官網源碼 瀏覽:867
網頁弄成pdf 瀏覽:223
dos的刪除命令 瀏覽:309
區塊鏈的加密物聯網傳輸 瀏覽:571
如何卸載桌面布局已定的app 瀏覽:678
vs重置命令 瀏覽:613
如何學會學習python 瀏覽:227
程序員釘釘 瀏覽:758
gcc編譯器生成目標文件 瀏覽:157
怎麼改伺服器ip地址嗎 瀏覽:56
cmd輸入命令斷開連接 瀏覽:911
二線大廠程序員員工年薪 瀏覽:988
程序員能從事導彈行業嗎 瀏覽:938