变量之间类型隐式转换的坑

先问问自己,当初学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;
}
发布了79 篇原创文章 · 获赞 95 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_43058685/article/details/105253748