社区
C语言
帖子详情
C里面没有SubStr();这个函数?请什么方法可最快实现!
mycoolu
2003-08-19 03:51:32
C里面没有SubStr();这个函数?请什么方法可最快实现!
...全文
498
31
打赏
收藏
C里面没有SubStr();这个函数?请什么方法可最快实现!
C里面没有SubStr();这个函数?请什么方法可最快实现!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
《你必须知道的495个C语言问题》
可我找不到任何
方法
来声明这样的
函数
——感觉我需要一个返回指针的
函数
,返回的指针指向的又是返回指针的
函数
……,如此往复,以至无穷。 12 数组大小 13 1.23 能否声明和传入数组大小一致的局部数组,或者由...
你必须知道的495个C语言问题
可我找不到任何
方法
来声明这样的
函数
——感觉我需要一个返回指针的
函数
,返回的指针指向的又是返回指针的
函数
……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数...
串类型的基本定义和
实现
//Index中包括了一个静态
函数
get_next(),这个
函数
可以得到字符串的最简匹配值(kmp算法中字符匹配失败后的下一个最佳匹配值) //用字符串Tstr替换主串str中出现的所有与
substr
相等的子串 int StrReplace(HString *...
C/C++编程笔记:C++中的
substr
()
函数
,教你具体使用
方法
substr
是C++语言
函数
,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果
没有
指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。——百度百科 在C ++中,...
MySQL
substr
函数
使用详解
MySQL截取字符串,MySQL分隔字符串,MySQL中的
substr
函数
,MySQL sunstr()
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章