觉得python语言的list的切片操作很方便,用c语言实现一个简单版本的.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/* 实现类似python中list(元素类型为char)的切片操作
*
* test="abcdef"
* slice(test,1,4,1) 返回:"bcd"
* slice(test,-1,3,-1) 返回:"ef"
* slice(test,0,5,2) 返回:"ace"
*
*/
//获取src字符串从left到right索引(不包含right索引处)的子字符串
char* slice(char* src,int left,int right,int step){
//把所有的负号索引全部转换为正号索引
int len=strlen(src);
if(left<0)
left=len+left;
if(right<0)
right=len+right;
if(step<0){//从右往左 不包含right索引
//满足 :left > right
//从right索引遍历到left索引-1处,步长为step的绝对值
if(left>right){
char* dest=(char*)malloc( (left-right) / (-step) +1);
int i=right+1,k=0;
while(i<=left){
dest[k]=src[i];
i+=-step;
k++;
}
dest[k]='\0';
return dest;
}else{
return NULL;
}
}else if(step>0){//从左往右 不包含right索引
//满足 :left < right
//从left遍历到right-1处,步长为step的绝对值
if(left<right){
char* dest=(char*)malloc( (right-left) / step +1);
int i=left,k=0;
while(i<right){
dest[k]=src[i];
i+=step;
k++;
}
dest[k]='\0';
return dest;
}else{
return NULL;
}
}else{
return NULL;
}
}
int main(void){
char* test="abcdef";
char* dest=slice(test,1,4,1);
printf("%s\n",dest);
dest=slice(test,-1,3,-1);
printf("%s\n",dest);
dest=slice(test,0,5,2);
printf("%s\n",dest);
dest=slice(test,1,5,-1);
printf("异常,所以返回地址为NULL:%p\n",dest);
}