strstr,

1,strstr函数

自己最开始的思路,主要有两个缺陷,缺陷2修改了。

//strstr函数
bool find_sub(const char* str,const char* sub){
  if(NULL==str) return false;
  if(NULL==sub) return true;
  const char* t=sub;
  //下面两个不应该调用库函数
  size_t len=strlen(str);
  size_t tlen=strlen(sub);
  if(tlen>len) return false;
  for(int i=0;i<=len-tlen;++i){
	  int j=i;
	  //while(str[j]==*t) j++,t++;这样写有错,当两个字符串完全相等时错误
	  while(str[j]&&*t&&str[j]==*t) j++,t++;
	 if('\0'==*t) return true;
	 t=sub;
  }
  return false;
}
参照网上的

char * find_sub2(const char* str,const char* sub){
   if(!*str) return (char*)str;
   char* cp=(char*)str;
   char* t=NULL;
   char* s=NULL;
   while(*cp){
	 s=cp;
     t=(char*)sub;
	 while(*s&&*t&&!(*s-*t)) s++,t++;
	 if(!*t) return cp;
	 cp++;
   }
   return NULL;
}


2找出第一个不重复的字符:

const int N = 26;  
int bit_map[N];  
void findNoRepeat(char *src)  
{  
    int pos;  
    char *str = src;  
    int i ,len = strlen(src);  
    //统计  
    for(i = 0 ; i < len ;i ++)  {
        bit_map[str[i]-'a'] ++;  
	}
    //从字符串开始遍历 其bit_map==1 那么就是结果  
    for(i = 0 ; i < len ; i ++)  
    {  
		int tt=bit_map[str[i]-'a'] ;
        if(bit_map[str[i]-'a'] == 1)  
        {  
            printf("%c",str[i]);  
            return ;  
        }  
    }  
} 
看到网上这段代码,觉得只能处理字符串中内容为a-z的判别,而结果竟然能处理所有的情况,如"abAba"也能找到A,之所以成功是因为bit_map[-27]等也有效

const int N = 26;  
int bit_map[N]; 
而当我把这两行移到程序中就不行了。在栈区的空间可以理解为有保护,但全局区难道就不保护呢?

不过还是这样保险:

char firstNotRepeat(const char* src){
	int hashTable[256]={0};
	const char *str=src;
	for(;*str;++str)
		hashTable[*str]++;
	str=src;
	for(;*str;++str){
		if(hashTable[*str]==1)
			return *str;
	}
	return 0;
}

3.strcpy

我最开始写的:

bool myStrcpy(const char* src,char* dst){
   if(NULL==src||NULL==dst) return false;
   while(*src) *dst++=*src++;
   *dst='\0';
   return true;
}

还是没有while((*dst++=*src++)!='\0'));精妙呀

    //得2分     
    void strcpy( char *strDest, char *strSrc )     
    {     
        while( (*strDest++ = * strSrc++) != '/0' );     
    }      
      
    //得4分     
    void strcpy( char *strDest, const char *strSrc )      
    {     
        //将源字符串加const,表明其为输入参数,加2分     
        while( (*strDest++ = * strSrc++) != '/0' );     
    }      
      
    //得7分     
    void strcpy(char *strDest, const char *strSrc)      
    {     
        //对源地址和目的地址加非0断言,加3分     
        assert( (strDest != NULL) && (strSrc != NULL) );     
        while( (*strDest++ = * strSrc++) != '/0' );     
    }      
      
    //得9分     
    //为了实现链式操作,将目的地址返回,加2分!     
    char * strcpy( char *strDest, const char *strSrc )      
    {     
        assert( (strDest != NULL) && (strSrc != NULL) );     
        char *address = strDest;      
        while( (*strDest++ = * strSrc++) != '/0' );      
        return address;     
    }    
      
    //得10分,基本上所有的情况,都考虑到了  
    //如果有考虑到源目所指区域有重叠的情况,加1分!     
    char * strcpy( char *strDest, const char *strSrc )      
    {     
        if(strDest == strSrc) { return strDest; }  
        assert( (strDest != NULL) && (strSrc != NULL) );     
        char *address = strDest;      
        while( (*strDest++ = * strSrc++) != '/0' );      
        return address;     
    }    

不过上述满分代码仍然不能检测下述情况:

char src[]="helllo";
    char *p=src+1;
    strcpy(p,src+3);


上述代码会破坏掉src的内容。

下述参照http://blog.csdn.net/v_july_v/article/details/6417600博文吧,下面好像格式有问题

char * mystrcat(char* dst,const char* src){
    assert(dst!=NULL);
   char* ret=dst;
   while(*dst) dst++;
   while((*dst++=*src++)!=0) ;
   return ret;
}


char * __cdecl strcat (char * dst,const char * src) 
{ char * cp = dst; 
while( *cp ) cp++; /* find end of dst */ 
while( *cp++ = *src++ ) ; /* Copy src to end of dst */ 
return( dst ); /* return dst */
 }


int mystrcmp(const char* src,const char* src2){
   while(*src&&*src2&&*src++==*src2++);
   if(*src==0&&*src2==0) return 0;
   if(*src==0) return -1;
   if(*src2==0) return 1;
   return *src<*src2;
}
int __cdecl strcmp (const char * src,const char * dst)  
{  
    int ret = 0 ;  
    while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)  
        ++src, ++dst;   
    if ( ret < 0 )  
        ret = -1 ;  
    else if ( ret > 0 )  
        ret = 1 ;   
    return( ret );  
}  

unsigned int mystrlen(const char* str){
  unsigned int ret=0;
  while(*str) ret++,str++;
  return ret;
}
size_t __cdecl strlen (const char * str)  
{  
    const char *eos = str;  
    while( *eos++ ) ;   
    return( (int)(eos - str - 1) );  
}  




char *mystrncat(char* dst,const char* src,size_t count){   char* ret=dst;   while(*dst++);   dst--;   while(count--){     if(!(*dst++=*src++))         return ret;   }   *dst=0;   return ret;}char * __cdecl strncat (char * front,const char * back,size_t count)
  {      char *start = front;      while (*front++)   ;      front--;      while (count--)          if (!(*front++ = *back++))              return(start);           *front = '/0';          return(start);  }  



int mystrncmp(const char* str,const char* str2,size_t count){
  int ret=0;
  while(count--&&(!(ret=*(unsigned char*)str-*(unsigned char*)str2))&&*str2);
  if(ret<0) ret=-1;
  else if(ret>0) ret=1;
  return ret;
}
int __cdecl strncmp (const char * first,const char * last,size_t count)  
{  
    if (!count)  
        return(0);    
    while (--count && *first && *first == *last)  
    {  
        first++;  
        last++;  
    }  
    return( *(unsigned char *)first - *(unsigned char *)last );  
}
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值