2010-03-30 67 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也不鼓勵使用它的用法