先問問自己,當初學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;
}