您好我编写了我的有限状态自动机字符串匹配算法。但是我很难将字母表限制为只有两个字符。我的实现看起来类似于 http://www.sanfoundry.com/cpp-program-perform-finite-state-automaton-based-search/。
NO_OF_CHAR变量表示程序的字母表。我试图将此限制为只有两个字符{0,1},例如:0101001。如果有人知道有限状态自动机,输入将不胜感激。
答案 0 :(得分:1)
从OP回答我关于程序输入的问题:
char text [] =“0101001010101”; char pattern [] =“1001”;
所以你给它一个普通的字符串,其中的字符用ASCII编码。 FSM使用这些字符来索引状态和转换表(第60行)。输入字符串中的字符“0”是int值48而“1”是49.当你声明数组2项时那些值使表达式远远超出数组限制并读取一些随机数据。这导致程序以意想不到的方向徘徊并最终崩溃。这是Undefined Behavior的一个特例。
解决方案:设置NO_OF_CHAR至少 49 49 + 1。 (谢谢@wildplasser!)
答案 1 :(得分:0)
答案已被接受,但我根据OP在此主题的早期问题中坚持认为必须只有2种可能性。
int TF[][NO_OF_CHARS]
是一个最初由#define NO_OF_CHARS 256
调整大小的数组。因此,在示例中,所有可能的unsigned char
值都可以为其编制索引。当您尝试将字符数减少到2
时,您只能按0
或1
对此数组编制索引,但如果您的'0'
和'1'
为蜂窝字符串是ASCII值,它们会破坏数组。
基于这条线(以及可能还有其他线)正在使用数组
state = TF[state][txt[i]];
请注意,对于字符'0'
和'1'
,数组将被48
和49
编入索引。你需要在这里以及其他地方做些什么呢?
state = TF[state][txt[i] & 1];
另请注意是否有0
或1
索引转回char
的地方。如果是这样,您需要将'0'
添加到数组索引。