一次C語言實現過濾冗餘字元出現的問題

來源:互聯網
上載者:User

作者:柳晛
屬性:原創
發表時間:2007-2-2

計劃寒假期間編寫一套資料加密系統,在處理密鑰時考慮將同一把密鑰中的重複位元組慮掉,否則密文體積將會增大,產生冗餘成分。  

開始代碼是這樣寫的:

Code
 1 #include"stdio.h"
 2 #include"string.h"
 3 void main()
 4 {int i,j,x,z;
 5 char a[20]={0};
 6 gets(a);
 7 z=strlen(a);
 8 for(i=0;i<z;i++)
 9     for(j=i+1;j<z;j++)
10         if(a[i]==a[j])
11         {    z--;
12            for(x=j;x<=z;x++)
13            a[x]=a[x+1];
14         }
15 for(i=0;i<20;i++)
16     printf("%c,",a[i]);
17 printf("\n");
18 printf("%d\n",z);
19 }

結果調試的時候總是出現結果錯誤,於是我代入一組資料手工計算,發現當兩個以上字元連續出現的時候,就會略過向前相鄰的字元比如:
輸入“aaa”機器在檢測的時候會發現第一個“a”與第二個“a”相同,則用第三個“a”覆蓋第二個“a”,繼續向後檢測。機器向後檢測就略過了第三個“a”補充到第二個位置的“a”,所以運行結果是“aa”,沒有將多餘的“a”全部刪除,未達到預期目的。
錯誤是由於使用了傳統習慣上的for迴圈第三個運算式做累加器,這樣只要一個重複持續時間結束,就會使累加器工作,而後面的資料向前錯了一位,就需要暫停累加重新比較一下,所以累加器不能放在for迴圈中,而是先重新比較,如果沒有問題再進行累加,使用了判斷語句進行限制。

正確的代碼如下:Code
 1 #include"stdio.h"
 2 #include"string.h"
 3 void main()
 4 {int i,j,x,z;
 5 char a[20]={0};
 6 gets(a);
 7 z=strlen(a);
 8 for(i=0;i<z;i++)
 9     for(j=i+1;j<z;)
10         if(a[i]==a[j])
11         {    z--;
12            for(x=j;x<=z;x++)
13            a[x]=a[x+1];
14         }
15         else
16             j++;
17 for(i=0;i<20;i++)
18     printf("%c,",a[i]);
19 printf("\n");
20 printf("%d\n",z);
21 }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.