例如:
输入 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;
}