限制有限状态自动机字符串匹配的字母表

时间:2015-03-18 14:01:17

标签: c string-matching state-machine alphabet

您好我编写了我的有限状态自动机字符串匹配算法。但是我很难将字母表限制为只有两个字符。我的实现看起来类似于 http://www.sanfoundry.com/cpp-program-perform-finite-state-automaton-based-search/

NO_OF_CHAR变量表示程序的字母表。我试图将此限制为只有两个字符{0,1},例如:0101001。如果有人知道有限状态自动机,输入将不胜感激。

2 个答案:

答案 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时,您只能按01对此数组编制索引,但如果您的'0''1'为蜂窝字符串是ASCII值,它们会破坏数组。

基于这条线(以及可能还有其他线)正在使用数组

state = TF[state][txt[i]];

请注意,对于字符'0''1',数组将被4849编入索引。你需要在这里以及其他地方做些什么呢?

state = TF[state][txt[i] & 1];

另请注意是否有01索引转回char的地方。如果是这样,您需要将'0'添加到数组索引。