码迷,mamicode.com
首页 > 其他好文 > 详细

关于在判断条件中使用strlen()函数的问题

时间:2020-04-09 21:38:30      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:kmp算法   原型   无符号   i++   ext   条件   算法   sign   一个   

在写KMP算法时,我写了个这样的条件判断循环

	while (i<strlen(a)&&j<strlen(s))//这是错的!!!
	{
		if (j == -1 || a[i] == s[j])
			i++, j++;
		else
			j = n[j];
	}

然后出现了一个百思不得其解的问题。当j=-1时,直接跳出循环。查了半天才知道是函数问题。

现在我们来看一下strlen函数原型。

extern unsigned int strlen(char *s);
在Visual C++ 6.0或Dev-C++中,原型为
size_t strlen(const char *string);
其中size_t实际上是unsigned int

计算给定字符串的(unsigned int型)长度,就是这一点!!!

它的返回值是一个 unsigned int 类型。j<strlen(s)在执行时,由于两边的类型不一样所以要转换,无符号比有符度号的内有效值范围大,所以将i转换成无符号的数字再比较,这一转就出问题了,有符号的-1转换成无符号成了0xffffffff,这是无符号的最大值,所以i<strlen(a)始终为false,所以我写的函数只要当j<0,必定跳出循环。

在此建议使用strlen函数的值作为条件循环时,应先赋值给int类型,或者使用c++中的string。

谨以此博文告诫自己!!!

关于在判断条件中使用strlen()函数的问题

标签:kmp算法   原型   无符号   i++   ext   条件   算法   sign   一个   

原文地址:https://www.cnblogs.com/lonely-ok/p/12669568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!