懂得实现字符串的操作(strcpy函数等)(一)

一般面试的时候,如果要考查你的C++基本功,关于字符串的实现的内容出现的频率比较高。
下面是个人实现的三个简单的字符串相关函数,以后会陆续补充。


//(1)查找字符串中的子串
int mystrstr(const char* string,const char* substring)
{
if(string==NULL||substring==NULL)return -1;

int s1=strlen(string);
int s2=strlen(substring);

if(s1<s2)return-1;

const char* temp=substring;

while(*(string++)!='\0') //字符串未扫描完毕
{
if(*string==*substring) //当前字符匹配
{
while(*substring!='\0') //判断是否与整个目标字符串匹配
{
if(*(string++)!=*(substring++)) //若匹配过程不成功,则进行下一阶段扫描
{substring=temp;break;}

if(*substring=='\0')return 1; //匹配成功
}
}
}

return -1;
}

//(2)复制字符串函数
char* mystrcpy(char* DestStr,const char* SrcStr) //源字符串标明为const
{
if(DestStr==SrcStr)return DestStr; //自我复制
assert((DestStr!=NULL)&&(SrcStr!=NULL)); //断言地址非空

char* tempStr=DestStr;

while((*(DestStr++)=*(SrcStr++))!='\0'); //复制过程,遇到'\0'结束

return tempStr; //返回目标地址,方便链式操作
}

//(3)在一个字符串中找到第一个只出现一次的字符。如输入dsfsdfghyjkoooi,结果将输出g。
char findDestChar(const char* str)
{
int hashTable[256]={0}; //一个字符一个byte,则字符个数不超过256个

const char* temp=str;
while(*str!='\0')
{
hashTable[*str]++;
str++;
}
while(*temp!='\0')
{
if(hashTable[*temp]==1)return *temp;
temp++;
}

return '\0';
}


资料补充:关于strcpy函数实现的标准,如何将它写得完美(转载自http://blog.csdn.net/v_JULY_v/archive/2011/05/13/6417600.aspx)

//得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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值