通过行程编码压缩字符串

时间:2015-04-23 12:04:08

标签: c string

问题是: 字符L在文本文件中重复20次,即文件中的某个地方我们有LLLLLLLLLLLLLLLLLLLL。它需要20个字节来存储L的“运行”。但是,如果我们在文件中写入20L则需要更少的时间。但是20不是一个角色。这是一个数字,我们不想在文本文件中写入数字。还有另外一条出路。让我们用大写字母来表示运行,即如果我们写AL就会出现L,如果两次,我们写BL等等。因此,我们为L次出现的L次写入TL。这种方法最多只能编码26次。如果一个角色出现得更多,那么我们可以为它再写一个代码。因此,在编码文件中,为了节省空间,一串DfFAB-ZsAsD AA代表ffffAAAAAA-sssssssssssssssssssssssssssssss 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;
}

当我提供输入时,&#34; eee&#34;或者&#34; eeeee&#34;,输出分别是CeA和EeA。它最后会打印一个额外的A.我无法在代码中找到错误。

1 个答案:

答案 0 :(得分:3)

你的问题是:

JAVA_HOME/environment

这不会覆盖szInput[iii--] = '\0';

你应该写:

\n