變量之間類型隱式轉換的坑

先問問自己,當初學C語言時,數據類型的轉換規則還記得嗎。

在這裏插入圖片描述

不管是教科書或者一些視頻上,應該都會提到。在C語言或者C++中,數據類型的轉換有兩種方式:

一)強制轉換。

如下面這種

int a=10;
double b;
b=(double)a;

二)隱式轉換

當運算符兩邊的數據類型不一致時,編譯器會主動進行數據類型轉換。轉換的規則是低類型像高類型轉換。隱式轉換方向如下圖所示。

在這裏插入圖片描述

KMP算法的坑

既然知道了數據類型之間的隱式轉換,那麼下面這個坑就很顯而易見了。

有個同學在寫下面這個kmp算法時遇到了一個坑,在while循環的時候總是莫名的退出。

那麼到底時什麼問題呢?

strlen這個函數返回值類型爲size_t也就是unsigned int

當int類型的變量jisize_t類型變量做比較時,ji會轉換成unsigned int類型。

如果當ji值爲-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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章