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 );
}