一般面试的时候,如果要考查你的C++基本功,关于字符串的实现的内容出现的频率比较高。
下面是个人实现的三个简单的字符串相关函数,以后会陆续补充。
资料补充:关于strcpy函数实现的标准,如何将它写得完美(转载自http://blog.csdn.net/v_JULY_v/archive/2011/05/13/6417600.aspx)
下面是个人实现的三个简单的字符串相关函数,以后会陆续补充。
//(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;
}