查找字符串中连续的最长的数字串

例如:

输入 1,  输出 1

输入 12, 输出 12

输入 1a234, 输出 234

输入 1a222234bbb987654321, 输出 987654321

... ...

写了两次,第二次代码量在第一次的基础上减少了10行。下面附上第二次的代码,如果还可以精炼,忘各位大牛指点

char *Find2(const char *str)
{
	if (str==NULL || strlen(str)==0) {
		return NULL;
	}

	char *buf = (char*)malloc(strlen(str)+1);
	memset(buf, 0, strlen(str)+1);

	char ch;
	const char *beg, *end;
	while (ch=*str++) {
		/*如果串首字符为非数字,直接跳过*/
		if (ch<'0' || ch>'9') {
			continue;
		}
		int t = ch - *str; //得到相邻两个数的差值
		if (t == 0) { // 如果相邻两个数为数字且相同 
			continue;
		}
		if (strlen(buf) <=1 ) {
			strncpy(buf, &ch, 1); //保存当前串首的连续的相同的字符,只保存一个字符
			buf[1] = '\0';
		}

		if (t==1 || t==-1) { //遇到连续的数字串
			beg = str -1; //保存首个不连续的数字字符地址
			while (*str - *(str+1) == t) { //判断是否一致保持该连续状态
				++str;
				continue;
			}
			end = str; //保存连续状态的最后一个字符地址
			if (strlen(buf) <= end-beg+1) { //如果当前连续串长度不小于已匹配的连续串长度,则保存当前连续串
				strncpy(buf, beg, end-beg+1);
				buf[end-beg+1] = '\0';
			}
		}
	}

	return buf;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值