C里面没有SubStr();这个函数?请什么方法可最快实现!

mycoolu 2003-08-19 03:51:32
C里面没有SubStr();这个函数?请什么方法可最快实现!
...全文
496 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cybergate 2003-08-26
  • 打赏
  • 举报
回复
begincsdn(begincsdn):

我开始也考虑过用返回静态数组的方法,但后来发现用起来特别费劲。因为每次调用substr它的内容都会被修改。如果要多次调用的substr话每次还要把每次的结果“备份”下来,实际上相当于复制了两次,大大降低了效率。其实最好的方法就是仿照库函数的接口,即标准的C风格。
Cybergate 2003-08-26
  • 打赏
  • 举报
回复
抱歉,刚刚那个程序还有点小问题,健壮性也不太好
不过,即使加入所有的条件判断,函数也不长。

采用size_t类型防止负数,并加入了对NULL, “字符串长度小于等指定的位置”,以及可复制长度不够的判断。程序也就四行。


#include <stdio.h>
#include <assert.h>

void SubStr(char *szDest, const char *szSrc, size_t nPos, size_t nLen)
{
assert(szDest); assert(szSrc);
while (*szSrc && nPos--) szSrc++;
while (*szSrc && nLen--) *szDest++=*szSrc++;
*szDest='\0';
}

main()
{
char a[]="Hello world";
SubStr(a, a, 10, 3); // 从第十个起取三个,实际上只有一个d
puts(a);
}
俞庆平 2003-08-26
  • 打赏
  • 举报
回复
//更正: //如果字符串长度小于等指定的位置。
俞庆平 2003-08-26
  • 打赏
  • 举报
回复
补充两句:
在处理这个问题的时候,首先我们不能强求用户指定一个非空的字符串,
同时也不能将错误直接丢给用户来处理,因为assert是方便调试使用,
应该尽可能地将错误状态捕捉并作相应的处理。
俞庆平 2003-08-26
  • 打赏
  • 举报
回复
楼上还有错误,pos,length的符号没有判断。
如果strDest的长度小于length怎么办?
如果pos的大小大于strlen(strDest)怎么办?
对于strDest和strSrc 为NULL时,特别是strSrc为NULL直接返回""即可。

const int MAX_STRING_LENGTH = 256;
char * substr(char * srcstr,int pos , int length)
{//纯C的写法是:pos从0开始计数,如果有错漏,望不吝赐教!
static char paddr[MAX_STRING_LENGTH] = "";
if(pos < 0 || length < 1 || srcstr == NULL) return paddr;
int slen = (int)strlen(srcstr);
if(slen - 1 <= pos) //如果长度大于等指定的位置。
return paddr;
char * ppos = (char *)(&srcstr[pos]);//取得位置
if(slen - 1 - pos <= length)
slen -= pos;
else slen = length;
strncpy(paddr,ppos,slen);
paddr[slen] = '\0';
return paddr;
}

foxfur 2003-08-26
  • 打赏
  • 举报
回复
不好意思,上面的程序有些错误!改正如下:

char *substr(char *strDest, const char *strSrc, int posi, int length);
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
for(; ((length > 0) && (*strDest++ = strSrc[posi++])); length--);
return address;
}
hellobcb 2003-08-26
  • 打赏
  • 举报
回复
#include <stdio.h>
int substr(char *str1,int begin,int count,char *str2)
{
while(begin>0&&count>0&&begin+count<=strlen(str1)+1)
{
char *temp;
int i;
for(i=0,temp=str1+begin-1;i<count;i++,temp++)
str2[i]=*temp;
str2[count]='\0';
return 1;
}
return 0;
}

main()
{
char *str2;
char *str1="abcdeft";
str2=(char *)malloc(strlen(str1));
if(substr(str1,2,3,str2))
printf("%s\n",str2);
else
printf("please check your parameters!\n");
free(str2);
return 0;
}
esupermary 2003-08-26
  • 打赏
  • 举报
回复
楼上的,你是个高手呀。
foxfur 2003-08-26
  • 打赏
  • 举报
回复
这个怎样?加入assert可以在程序运行中报错,防止系统崩溃!!:)

strDest: 目的指针
strSrc: 源指针
posi: 拷贝的起始位置(从该位置开始拷贝)
length: 拷贝的长度

char *substr(char *strDest, const char *strSrc, int posi, int length);
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
for(; ((length > 0) && (*strDest++ = * strSrc++)); length--);
return address;
}
Cybergate 2003-08-26
  • 打赏
  • 举报
回复
好难??只要一行就行了

void substr(char *dest, const char *src, int start, int end)
{
while (start<=end&&(*dest++=src[start++]));
}

用法:
substr(a, "Hello world", 1, 9) 将Hello world的第一个(H是第零个)到第九个复制到a中,a就是子串
mycoolu 2003-08-26
  • 打赏
  • 举报
回复
哎!!求一个SUBSTR();函数好难呀 !!!!标准C的!
lwk_hlj 2003-08-26
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
int substr( char *source,int startx,int length,char *tt)
{

int i=0;
int iCount=0;
int j=0;
iCount=strlen(source);
if (startx>=iCount)
{
return 1;
}
for (i=0;i<length;i++)
{
tt[j]=source[i+startx];
j++;
}
return 0;
}
int main(int argc, char *argv[])
{
char *str="0123456789";
char *ttt;
int i=0;
ttt=malloc(3);
i=substr(str,5,3,ttt);

printf("%s\n",ttt);
system("PAUSE");
return 0;
}
mycoolu 2003-08-26
  • 打赏
  • 举报
回复
不行!!!
mycoolu 2003-08-26
  • 打赏
  • 举报
回复
结贴!
hellobcb 2003-08-19
  • 打赏
  • 举报
回复
楼上:局部变量的地址可以返回吗?

#include <stdio.h>
#include <string.h>
int substr(char *str1,int begin,int count,char *str2)
{
while(begin>0&&count>0&&begin+count<=strlen(str1))
{
char *temp;
int i;
for(i=0,temp=str1+begin-1;i<count;i++,temp++)
str2[i]=*temp;
str2[count]='\0';
return 1;
}
return 0;
}

main()
{
char *str2;
char *str1="abcdeft";
if(substr(str1,2,5,str2))
printf("%s\n",str2);
else
printf("please check your parameters!\n");
return 0;
}
xiaoxuw 2003-08-19
  • 打赏
  • 举报
回复
char* SubStr(char* Str,long start,long len)
{
char* Res="";
long i=0;
while(Str[i]!='\0')
{
if(i>=start && i<=start+len)
{
strcat(Res,&Str[i]);
}
else if(i>start+len)
{
break;
}
i++;
}
return Res;

}
hellobcb 2003-08-19
  • 打赏
  • 举报
回复
加上#include <string.h>是可以的。
mycoolu 2003-08-19
  • 打赏
  • 举报
回复
哎!写个函数是不难,但是对自己的函数不满意!

strncpy不认呀!要是认的话我还会问吗!

所以上来问问各位大侠!
aflyinghorse 2003-08-19
  • 打赏
  • 举报
回复
strncpy();就是C语言的库函数
在#include <string.h>中声明
yurius 2003-08-19
  • 打赏
  • 举报
回复
自己写个函数应该不难吧
加载更多回复(11)

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧