1.MyStrlen的实现
1).字符数组方法:
unsigned int MyStrlen(char str[])
{
int i;
unsigned int len=0;
for(i=0;str[i]!='\0';i++)
{
len++;
}
return len;
}
实现原理:
2).指针法:
unsigned int MyStrlen(char *pStr)
{
unsigned int len =0;
for(;*pStr!='\0';pStr++)
{
len++;
}
return len;
}
实现原理:
为了对函数进行优化,可以对将函数声明为如下:
unsigned int MyStrlen(const char str[])
unsigned int MyStrlen(const char *pStr)
保护指针变量所指向的变量不被改变。进一步优化:
unsigned int MyStrlen(const char *pStr)
{
unsigned int len =0;
while(*pStr++)
{
len++;
}
return len;
}
unsigned int MyStrlen(const char *pStr)
{
const char *start=pStr;
while(*pStr)
{
pStr++;
}
return pStr-start;
}
2.字符串复制函数
1).字符数组:
void MyStrcpy(char dstStr[],char srcStr[])
{
int i=0;
while(srcStr[i]!='\0')
{
dstStr[i]=srcStr[i];
i++;
}
dstStr[i]='\0';
}
2).指针法:
void MyStrcpy(char *dstStr,char *srcStr)
{
while(*srcStr!='\0')
{
*dstStr=*srcStr;
srcStr++;
dstStr++;
}
*dstStr='\0';
}
原理如下图所示,进一步优化:
void MyStrcpy(char *dstStr,char *srcStr)
{
while(*srcStr)
{
*dstStr++ = *srcStr++;
}
*dstStr='\0';
}
语句*srcStr!='\0'和<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">*srcStr等价</span>
最精简版本:
void MyStrcpy(char *dstStr,const char *srcStr)
{
while(*dstStr++ = *srcStr++)
{
;
}
}
最后,关于程序效率的几点建议:
1.不要一味地追求程序的效率,应当在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率;
2.不要追求紧凑的代码,因为紧凑的代码不一定产生高校的机器码;
3.以提高程序的全局效率为主,以提高程序的局部效率为辅;
4.在优化程序的效率时,应该设发找出影响程序效率的瓶颈,而不要在无关紧要的地方修改程序;
5.先优化数据结构和算法,再优化执行代码;
6.时间效率和空间效率对立时,应该分析哪个更重要,适当地做出折衷
来自哈尔滨工业大学MOOC课件