`
moxiaomomo
  • 浏览: 44099 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • C++
阅读更多
一般面试的时候,如果要考查你的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;     
}   

2
2
分享到:
评论
2 楼 moxiaomomo 2011-05-21  
基德KID.1412 写道
查找字符串中的子串,子串可以不连续对吧?

一般来说子串应该是指连续的吧
1 楼 基德KID.1412 2011-05-21  
查找字符串中的子串,子串可以不连续对吧?

相关推荐

Global site tag (gtag.js) - Google Analytics