先问问自己,当初学C语言时,数据类型的转换规则还记得吗。
不管是教科书或者一些视频上,应该都会提到。在C语言或者C++中,数据类型的转换有两种方式:
一)强制转换。
如下面这种
int a=10;
double b;
b=(double)a;
二)隐式转换
当运算符两边的数据类型不一致时,编译器会主动进行数据类型转换。转换的规则是低类型像高类型转换。隐式转换方向如下图所示。
KMP算法的坑
既然知道了数据类型之间的隐式转换,那么下面这个坑就很显而易见了。
有个同学在写下面这个kmp算法时遇到了一个坑,在while循环的时候总是莫名的退出。
那么到底时什么问题呢?
strlen
这个函数返回值类型为size_t
也就是unsigned int
。
当int类型的变量j
、i
与size_t
类型变量做比较时,j
、i
会转换成unsigned int
类型。
如果当j
、i
值为-1
时,转成unsigned int
后就变成了2的32次方-1。
#include<stdio.h>
#include<string.h>
#define max 1000005
int nextval[max];
char s[max], t[max];
void getnextval(char t[])
{
int j, k;
j = 0; k = -1;
nextval[0] = -1;
for (j = 0; j < strlen(t);) {
if (k == -1 || t[j] == t[k]) {
k++; j++;
if (t[j] != t[k])nextval[j] = k;
else nextval[j] = nextval[k];
}
else k = nextval[k];
}
}
int main()
{
scanf("%s", s);
scanf("%s", t);
getnextval(t);
int i, j, k;
j = 0; i = 0;
while (j <strlen(t)&& i < strlen(s)) {
if (j == -1 || s[i] == t[j]) {
i++; j++;
}
else {
j = nextval[j];
}
}
if (j >=strlen(t)) {
printf("%d", i - strlen(t)+1);
}
else printf("0");
return 0;
}