这个RLE解码功能只解码第一个字符,我做错了什么?

时间:2018-03-10 03:37:14

标签: c++

我正在编写一个简单的程序,使用RLE算法压缩字符串,我成功编写了编码函数,并认为我也找到了解码函数,但它没有给出正确的输出。

string RunLengthDecoding(string input)
{
    string decodedOutput = "";
    int secondIterator = 0;
    for(int firstIterator=0; firstIterator<input.length(); firstIterator++)
    {
        string counter = ""; int letterCoefficient = 0;
        if(!isalpha(input[firstIterator]))
            continue;
        else
        {
            counter = input.substr(secondIterator, firstIterator);
            secondIterator = firstIterator;
            istringstream(counter) >> letterCoefficient;
            for(int i=0; i<letterCoefficient; i++)
                decodedOutput += input[firstIterator];
        }
    }
    return decodedOutput;
}

如果我输入“6A”或任何一个单个字符的数字,它可以正常工作。 示例:

  

6A - &gt; AAAAAA,77B - &gt; BBBBB ..... BBBBB 77次。

但是如果我输入“6A3B”就会吐出“AAAAAA”。或者实际上任何一个数字都贴在A旁边,而且任何数字都贴在B旁边,它仍然只是打印第一个字符的前缀次数,完全忽略了它之后的所有内容。

1 个答案:

答案 0 :(得分:1)

应该是更像这样的东西:

string RunLengthDecoding(string input)
{
    string decodedOutput = "";
    int secondIterator = 0;
    for (int firstIterator = 0; firstIterator<input.length(); firstIterator++)
    {
        string counter = ""; int letterCoefficient = 0;

        if (!isalpha(input[firstIterator]))
            continue;
        else
        {
            counter = input.substr(secondIterator, firstIterator - secondIterator); // Little change here
            secondIterator = firstIterator + 1; // Add one here
            istringstream(counter) >> letterCoefficient;
            for (int i = 0; i<letterCoefficient; i++)
                decodedOutput += input[firstIterator];
        }
    }
    return decodedOutput;
}

注意,这似乎适用于基本输入,例如&#34; 6A3B25C&#34;但我觉得某些边缘情况会破坏这一点,因为没有安全检查。