微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在字符串中找到全部是由指定的字符组成的最长子串

/* *!============================================================== *! FNAME: search.cpp *! BRIEF: *! AUTHR: RollStone *! EMAIL: jealdean@outlook.com *! VERNO: 1.0.31 *! CREAT: 2015-04⑵8 23:43:04 *! CHGON: 2015-04⑶0 07:53:00 *! *! copyright (c) 2015 All Rights Reserved By Abodu Org *!============================================================== */ ///编写1个 C 函数,该函数在1个字符串中找到可能的最长的全部是由指定的字符组成的子字符串 #include <stdio.h> #include <string.h> #include <stdlib.h> #ifndef strndup //自己手动实现 复制字符串前 n 个字符 char* strndup(const char* src,int nMax) { int srcLen=strlen(src); int n=(srcLen<nMax)?srcLen:nMax; char* dest=(char*)calloc(n+1,sizeof(char)); while(--n>=0) dest[n]=src[n]; return dest; } #endif /** * @brief * 在1个字符串中找到可能的最长的子字符串(该子字符串由同1字符组成) * @param str[] * @param tc 目标字符 * @param rcLen 返回的目标子串的长度 * * @return * tc没有在str中出现,返回NULL,否则返回最长子串的起始位置 */ char* search_max_substr(char src[],char ch,int* rcLen) { char* pStart; if(!src||!(pStart=strchr(src,ch))) { return NULL; } *rcLen=1;//最少有1个 char* pEnd=strrchr(src,ch); if(pEnd==pStart) { //有且唯一唯1的1个字符ch return pStart; } char* rcOut=pStart; char* pCur=pStart+1; while(pCur-1<=pEnd) { if( *(pCur-1)==*pCur) { pCur++; continue; } //当前指针与其紧邻的前1个指针的内容不相同 if(pCur-pStart>*rcLen) { //找到个数大于rcLen rcOut=pStart; *rcLen=pCur-pStart; //记录旧的移动次数 } //找到剩下的字符串内的第1个ch if(!pCur||!(pStart=strchr(pCur,ch))) { break; } pCur=pStart+1; } return rcOut; } int main ( int argc,char* argv[] ) { char s[]="AAAABBBCCDDEFFFFFFFFFF"; int n=0; char* p=search_max_substr(s,'D',&n); if(p) { char* sbk=strndup(p,n); if(sbk) { printf("RESULT:%s ",sbk); free(sbk); } } return 0; } // end main

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐