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。
提前谢谢!

最佳答案

在C99中,使用变量作为维度定义数组的能力被添加到C中。它还支持一些C++编译器的扩展,但不是C++标准的一部分,也不会是C++ 0x的一部分。如果您打算对C89编译器或C++进行移植,最好不要使用它。

关于c - 约束C语言中的数组维数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2543933/

10-13 05:07