自己写了一个高级版的取子串函数,可以完成正向取子串,反向取子串,
1、调用:
substr(取出的子串,源串,起始位置,长度)
函数返回实际取到子串的长度
其中长度可以为正数(从左边向右边取),长度为负数(从右边向左边取),长度可以超过实际能取到的子串长度,函数会智能判断,取长度范围内尽可能长的子串。
例:
int main(void){
char dc[20];
char *sc="deepfuture.iteye.com";
substr(dc,sc,5,2) ;//dc为"fu"
substr(dc,sc,5,-2) ;//dc为"pf"
substr(dc,sc,5,-2) ;//dc为"pf"
substr(dc,sc,5,-10) ;//dc为"deepf",从右边向左边取子串(-10为负数),因为10超过了能取子串的长度,所以该函数取到开始 处就停止。
substr(dc,sc,5,100);//dc为"future.iteye.com",从左边向右边取子串(100为正数),因为100超过了能取子串的长度,所以函数取到结束处就停止。
}
2、函数源代码
int substr(char* dchr,char *schr,int begin,int len){ //作者:刘兴(deepfuturelx@gmail.com) //取子串函数,dchr为取好后的子串,schr为源串,返回成功取出的子串数目,len为负数,则从begin向头部移动(正向),否则向尾部移动(反向),begin为起始位置(从1开始),len为子串长度 int slen=0; int rc=0; if (begin<=0) begin=1;//起始位置为0时,会从1开始 slen=strlen(schr)-begin; if (slen<=0||len==0){//当len为0或begin的位置已经超过源串长度时,取空串 *dchr=NULL; return rc; } if (len<0){//len为负数,表示从begin处向头部移动len个字符的子串,允许出现len移过头的现象(begin=3,len=-6,则取从位置1到位置3的子串) len=-len; if(len>strlen(schr)) begin=1; else if((begin-len)<=0){ len=begin; begin=1; } else { begin-=len; begin++; } } begin--; schr+=begin; int i=0; for(i=0;i<len&&*schr!=0;i++){ *dchr++ = *schr++; } *dchr=0; rc=i; return rc; }