2010-03-30 47 views
0
int KMP(const char *original, int o_len, const char *substring, int s_len){ 
if(o_len < s_len) 
    return -1; 

int k = 0; 
int cur = 1; 

int fail[ s_len ]; 

fail[ k ] = -1; 

while(cur < s_len){ 
    k = cur - 1; 
    do{ 
     if(substring[ cur ] == substring[ k ]){ 
      fail[ cur ] = k; 

      break; 
     }else{ 
      k = fail[ k ] + 1; 
     } 
    }while(k);  

    if(!k && (substring[ cur ] != substring[ 0 ])){ 
     fail[ cur ] = -1; 
    }else if(!k){ 
     fail[ cur ] = 0; 
    } 

    cur++; 
} 

k = 0; 
cur = 0; 

while((k < s_len) && (cur < o_len)){ 
    if(original[ cur ] == substring[ k ]){ 
     cur++; 
     k++; 
    }else{ 
     if(k == 0){ 
      cur++; 
     }else{ 
      k = fail[ k - 1 ] + 1; 
     } 
    } 
} 

if(k == s_len) 
    return cur - k; 
else 
    return -1; 
} 

这是我曾经编码过的KMP算法。当我今天上午审查它时,我发现奇怪的是整数数组被定义为int fail [s_len]。规范是否需要数组的编译时常量?这段代码如何通过编译? 顺便说一句,我的gcc版本是4.4.1。 在此先感谢!以C语言约束阵列维数

回答

7

使用变量作为维定义数组的能力已添加到C99的C中。它也作为一些C++编译器的扩展支持,但不是C++标准的一部分,并且不会成为C++ 0x的一部分。如果您计划向C89编译器或C++移植,最好不要使用它。

2

补充Neil的回答:这个特征被称为VLA - Variable Length Array。它的确加入了C99,目前得到了几个编译器的支持。除了可移植性问题,尼尔提到的

以及 other reasons也不鼓励使用它的用法