增加正在读取的字符

时间:2012-02-17 22:31:06

标签: c++

我正在尝试解码看起来像这样的输入文件:

abbaabbbbaababbaabababaabababaabbababaabababababababa...

并将其与我使用两个数组进行的临时映射进行比较

int secretNumber[10];
string coding[10];

coding[0]="abb";
coding[1]="aabbbba";
coding[2]="abab";
...

我不知道如何通过读取第一个'a'字符开始,然后检查它是否在编码数组中。如果打印出secretCoding并移动下一个字符b。否则,如果它不在数组中,则将下一个字符添加到字符串中的第一个字符,并检查数组中是否有“ab”,如果不是,则添加下一个产生“abb”的字符,依此类推。

这样的事情:

while (!(readFile.eof()) ){

  for(int i=0; i<10; i++){

    if(stringOfChars==coding[i]){
      cout << secretNumber[i] <<endl;
      //Now increment to next char
    }

    else{

      //combine the current string with the next character  
    }
  }
}

问题:如果匹配移动到下一个字符,如果没有将当前字符和下一个字符组合直到匹配,我该如何读取字符。

3 个答案:

答案 0 :(得分:1)

您应该使用名为interpreter的设计模式。

Here is a link to a c++ version.

答案 1 :(得分:0)

如果你想要一个适用于任意输入大小的解决方案,即不将整个输入存储在内存中,那么你可以使用一个队列(例如std::deque<char>)来读取一些字符。时间,从后面推送数据。然后检查队列是否还剩下三个,四个或五个字符,如果是,则将它们与您的模式进行比较;如果匹配,则从队列前面弹出相应的字符。

答案 2 :(得分:0)

我不确定,但也许您似乎正在尝试实施LZW compression algorithm。如果是这种情况,那么你必须稍微改变一下你的方法。如果您已确定您的密码是整数,那么您必须为字典的初始内容的所有元素分配代码。初始字典基本上是大小为1的源字母表中的所有字符串。在您的情况下,如果您保持简单,它将是“a到z”,或者只是“a”“b”

另一件事是你需要查看字典中任何已分配代码的现有字符串。最好的方法是使用STL map container,可以在您的情况下将strings映射到integers。此外,随着新字符串继续添加到字典中,最好对字典的大小进行限制。

总的来说,

  • 使用std::map< std::string, int > dictionary;作为strings的词典,例如abaaabaab,等等......以及它的匹配代码。
  • coding[0], coding[1]不是必需的,因为strings将作为此词典中的key
  • secretNumber[0], secretNumber[1]也不需要value,因为key会给出secretNumber。

以下是它的样子:

std::map< std::string, int > dictionary;
int iWordCount = 0;
/*
    Initialize the dictionary with the code for strings of length 1 in your source alphabet.
*/
dictionary["a"] = 0;
dictionary["b"] = 1;
iWordCount      = 2;    // We would be incrementing this as we keep on adding more strings to the dictionary.

std::string newWord = "", existingWord = "";

while (!(readFile.eof()) ){
    /*
        I'm assuming the next character is read in the variable "ch".
    */
    newWord += ch;
    if ( dictionary.count(newWord) != 0 ) {    // Existing word.        
        /*
            Do something
        */
    }
    else {            //    We encountered this word for the first time.
        /*
            Do something else
        */
    }  
}