在使用stlen()函数时遇到的运行异常问题

今天写了一个KMP算法,但是在使用strlen()函数获取字符串长度时,发现程序和预期不对,无论怎样调试结果依旧如此。因此我就找到了strlen()函数的定义,如下代码:

size_t __cdecl strlen(
    _In_z_ char const* _Str
    );

  可以看出来函数返回为size_t类型,再来看看他在C语言中的定义,为unsigned int类型,无符号整形。

typedef unsigned int     size_t;

再来看看我的代码:

int KMP(char *s, char * p,int *next)
{
	int i = 0;
	int j = 0;
	/*int k = strlen(s);
	int tmp = strlen(p);*/
	while (i < strlen(s) && j < strlen(p))
	{
		if (j==-1 || s[i] == p[j])
		{
			i++;
			j++;
		}
		else
			j = next[j];
	}
	if (j == strlen(p))
		return i-j;
	else
		return -1;
}

由于使用KMP算法,为了方便写程序next数组的第一位值为-1,小于零,所以在程序运行的过程中存在j的值为-1的情况,在执行while语句时

while (i < strlen(s) && j < strlen(p))

会出现-1和strlen()函数作比较的情况,在这种情况下-1会被强制转化成unsigned int型数据,(unsigned int)-1 =4294967295,是一个大于0的数。会出现while()语句不执行的情况,所以就出现了无论怎样调试都无法达到预期效果的情况。

解决这个问题的方法很简单,只需要定义两个int型变量,现将字符串的长度储存起来,在进行比较就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值