今天写了一个KMP算法,但是在使用strlen()函数获取字符串长度时,发现程序和预期不对,无论怎样调试结果依旧如此。因此我就找到了strlen()函数的定义,如下代码:
size_t __cdecl strlen(
_In_z_ char const* _Str
);
可以看出来函数返回为size_t类型,再来看看他在C语言中的定义,为unsigned int类型,无符号整形。
typedef unsigned int size_t;
再来看看我的代码:
int KMP(char *s, char * p,int *next)
{
int i = 0;
int j = 0;
/*int k = strlen(s);
int tmp = strlen(p);*/
while (i < strlen(s) && j < strlen(p))
{
if (j==-1 || s[i] == p[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j == strlen(p))
return i-j;
else
return -1;
}
由于使用KMP算法,为了方便写程序next数组的第一位值为-1,小于零,所以在程序运行的过程中存在j的值为-1的情况,在执行while语句时
while (i < strlen(s) && j < strlen(p))
会出现-1和strlen()函数作比较的情况,在这种情况下-1会被强制转化成unsigned int型数据,(unsigned int)-1 =4294967295,是一个大于0的数。会出现while()语句不执行的情况,所以就出现了无论怎样调试都无法达到预期效果的情况。
解决这个问题的方法很简单,只需要定义两个int型变量,现将字符串的长度储存起来,在进行比较就可以了。