ANSI C 88实现的忽略大小写strstr函数,帮忙挑挑毛病

yhb7805 2005-05-11 04:25:29
总是觉得太罗嗦,大家帮帮忙,给指点指点,有没有更好的思路?
char* strstrNoCap( const char *str1, const char *str2 )
{
int i = 0, j = 0;
char *rv = 0;
int ch1 = 0, ch2 = 0;

while(*(str1+i))
{
while(*(str2+j))
{
ch1 = (*(str1+i+j)>96) ? -32 : 0;
ch2 = (*(str2+j)>96) ? -32 : 0;
if((ch2 + *(str2+j)) == (ch1 + *(str1+i+j)) )
{
rv = str1 + i;
j++;
}
else
{
rv = 0;
break;
}
}
if(rv != 0)
return rv;
else
i++;
}
return rv;
}
...全文
262 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhb7805 2005-05-15
  • 打赏
  • 举报
回复
感谢大家,先结贴给分,回头再总结。不好意思,这两天杂事太多。
jingyueid 2005-05-12
  • 打赏
  • 举报
回复
代码而言,小生看不出还有什么可优化的余地,楼主的算法可以改进
楼主看下我写的这个,效率比你的高些。
///Author : Y.Jing
const char* strstrNoCap( const char* str1, const char*str2, int (*cmp)(const char, const char))
{
/*-------------------------------------------------------------------------
- len1 = strlen(str1)
len2 = strlen(str2)
of1 = offset in str1
of2 = offset in str2
*/
size_t i,
len1 = 0, len2 =0,
of1 = 0, of2 = 0;

/*-------------------------------------------------------------------------
- open is a magic flag. just for optimizing the subkey-builder
*/
int open = 0;

/*-------------------------------------------------------------------------
- match string key array
*/
int *key = NULL;

len1 = strlen(str1);
len2 = strlen(str2);

if ( len1 < len2 )
return NULL;

if ( !len2 )
return str1;

{ /* sub key builder */
len2 = strlen(str2);
key = (int*)malloc(len2*sizeof(int));

key[0] = 0;

for( i = 1; i < len2; i++ )
{
if ( cmp( str2[i], str2[0] ) )
{
open = (int)i;
key[i] = 1;
}
else
{
if ( open && key[i-1] >= 0 )
{
if ( i-open == open )
{
key[i] = 0;
open = 0;
}
else
{
if ( cmp( str2[i], str2[i-open] ) )
key[i] = 0;
else
{
if (open ==1)
{
open = 0;
key[i] = -open+1;
}
else
key[i] = 0;
}
}
}
else
key[i] = 0;
}
}

key[0] = 1;
}

{ /* match master string */
of1 = of2 = 0;
while( of1 < len1 )
{
if ( cmp(str1[of1], str2[of2]) )
{
of1++;
of2++;
}
else
{
if ( key[of2] < 0 )
of2 = -key[of2];
else
{
of1 += key[of2];
of2 = 0;
}
}
if ( of2 == len2 )
break;
}
}

delete[] key;

return str1+of1-of2;
}

/*
- the cmp function will compare 2 characters with ignoring case
*/
int cmp(const char c1, const char c2)
{
if ( c1 != c2 )
{
char ic1 = c1 > 96 ? c1 - 32 : c1;
char ic2 = c2 > 96 ? c2 - 32 : c2;
return ( ic1 == ic2 );
}
return 1;
}

这个从模式串产生的Key是我认为最快的了,并且产生Key的算法我也优化了。与最快匹配算法相比,我使用了负数类型。


----------------------------------------
du51 2005-05-11
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
int mystrstr(const char* dst,const char* src)
{
const char *p=dst-1,*q=src;
while(*(++p))
{
while(*p==*q&&*q)p++,q++; //如果要忽略大小写比较字符串,此处略加处理.
if(!*q)return p-dst+src-q;
else if(!*p)return -1;
else q=src;
}
return -1;
}
main()
{
char *test1="12345",*test2="345",c;
printf("%d\n",mystrstr(test1,test2));
scanf("%c",&c);
}
du51 2005-05-11
  • 打赏
  • 举报
回复
忽略大小写,就意味着只能是字母字符串?
jingyueid 2005-05-11
  • 打赏
  • 举报
回复
Mark,明天来解答
laomai 2005-05-11
  • 打赏
  • 举报
回复
int strcasecmp(const char* dst,const char* src)
{
for( ; tolower(*src) == tolwer(*dest); ++src,++dst)
if (*src == '\0')
return 0;
return tolower(*src)-tolower(*dst);
}
yhb7805 2005-05-11
  • 打赏
  • 举报
回复
char* strstrNoCap( const char *str1, const char *str2 )
{
int i = 0, j = 0;
char *rv = 0;
int ch1 = 0, ch2 = 0;

while(*(str1+i))
{
while(*(str2+j))
{
ch1 = (*(str1+i+j)>96) ? -32 : 0;
ch2 = (*(str2+j)>96) ? -32 : 0;
if((ch2 + *(str2+j)) == (ch1 + *(str1+i+j)) )
{
rv = str1 + i;
j++;
}
else
{
rv = 0;
break;
}
}
if(rv != 0)
return rv;
else
i++;
}
return rv;
}

69,371

社区成员

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

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