2015-04-23 25 views
0

問題是: 字符L在文本文件中重複20次,即文件中某處存在LLLLLLLLLLLLLLLLLLLL。它需要20個字節來存儲L的這個'運行'。但是,如果我們在文件中寫入20L,那麼它會少得多。但20不是一個角色。這是一個數字,我們不想在文本文件中編寫數字。還有另一條出路。讓我們用大寫字母來表示運行情況,即如果我們寫AL時發生L,如果兩次,我們寫BL,等等。所以我們爲TL出現了20次,這個方法只能編碼26次。如果一個角色出現得更多,我們可以爲它再寫一個代碼。因此,在編碼文件中,爲了節省空間,一串DfFAB-ZsAsD AA表示ffffAAAAAA-sssssssssssssssssssssssssss A.編寫一個從文本文件讀取並使用此方法壓縮的程序。通過遊程長度編碼壓縮字符串

我嘗試:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    printf("Enter input(max. 99 characters): "); 
    char szInput[100]; 
    char chInput; 
    int iii = 0; 
    do 
    { 
     chInput = getchar(); 
     szInput[iii] = chInput; 
     iii++; 
    } while (chInput != '\n'); 
    szInput[iii--] = '\0'; 
    char *szOutput = malloc(2 * (iii + 1) * sizeof(char)); 
    iii = 0; 
    int jjj = 0; 
    while (szInput[iii] != '\0') 
    { 
     int nCount = 1; 
     while (szInput[iii + nCount] == szInput[iii] && nCount < 26) 
     { 
      nCount++; 
     } 
     szOutput[jjj] = nCount + 64; 
     szOutput[++jjj] = szInput[iii]; 
     iii += nCount; 
     jjj++; 
    } 
    szOutput[jjj] = '\0'; 
    printf("%s", szOutput); 
    return 0; 
} 

當我給輸入 「EEE」 或 「EEEEE」 時,輸出分別是CEA和EEA。它最後打印一個額外的A.我在代碼中找不到錯誤。

+1

錯誤..我們怎麼知道L'是否'是一個計數還是一封信,比如你的第一個例子? –

+0

@WeatherVane我認爲OP在說它總是一個固定長度的兩個字符編碼。第一個字符是計數。第二個字符是字母。 – kaylum

+0

我現在看到了,但對於文本來說,這是一種非常低效的RLE方式,在這種情況下很少有兩個以上的連續字符。它使每個單身人士的要求翻倍。 –

回答

3

你的問題是這樣的:

szInput[iii--] = '\0'; 

這不是覆蓋\n

你應該寫:

szInput[--iii] = '\0'; 
+1

我剛要回答同樣的問題。此外,爲指針變量指定一個明確的名字可能會有所幫助。 – shaunakde

+2

評論也不會傷害。 – kaylum