求救!C语言中如何实现子串截取功能?
一直用java编程,C忘的差不多了,求助朋友们帮忙用纯C实现一个类似于java中substring的子串截取功能,模型如下:
char* substring( char* src , int index , int len )
{
……
return desc
}
其中:
src为原字符串指针
index为截取位置
len为截取长度
desc为截取后的字符串指针
[解决办法]
char* substring(char* src,int index,int len)
{
char *desc=(char*)malloc((len+1)*sizeof(char));
int i;
for(i=0;i<len;i++)
{
if(src[index+i]=='\0')
{
break;
}
desc[i]=src[index+i];
}
desc[i]='\0';
return desc;
}
随便写的
[解决办法]
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char* substring(const char* src, int index, int len)
{
char* str;
if(src == NULL)
return NULL;
if(index + len > strlen(src))
return NULL;
str = (char*)malloc(sizeof(char) * (len + 1));
strncpy(str, src + index, len);
return str;
}
int main(int argc, char* argv[])
{
char* str = substring("hello world", 6, 5);
printf("%s\n", str);
return 0;
}
[解决办法]
我给个建议
你的一定有缺陷的,你要保证你的源字符串不被改变才好!
我给你个定义:char* substring(const char* src, int index, int len)
------------
在定以后,开始写代码:
首先,你要返回的是一个地址,所以你开始时应该定义一个指针,
至于指针的长度,鉴于\0和\n的问题,可以这样:
char * desc = (char *)malloc(sizeof(char)*(len+1))//注:这个加一就是为了防范\0和\n等等问题
------------
现在,你要做两个判断,
1、如果传入的字符串为空
2、如果查询的位置超界,即 index < 0 && (index+len) > (int)strlen(src);
符合这两种情况,free(desc);return -1
------------
接下来,就是正式的截取了!
2种方法,我写的时候,发现正好楼上2位分别写完了2种,这里就不迂腐,只是带过一句
方法1、利用strncpy()[这是2楼写法]
方法2、你隐式的将他们当成数组[这是1楼写法]
-------------
提示:
如果你想直接用指针,亲,我告诉你,会错的!!!
但是你想办法把const去掉了,那就好,没问题了!
[解决办法]
我个人比较建议稍微改下函数原型
char* substring( char* dstbuf ,char* src , int index , int len )
{
……
return dstbuf;
}
因为调用该函数的时候len是已知的,所以建议在substring外部先创建dstbuf,个人意见,供参考。