2015-04-23 24 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