下面这段代码是我随便写的一个测试代码;其中对mystrlen定义其实就是一个strlen函数实现源码,大家自己仔细分析一下。
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
int len=0;
int mystrlen(const char *StrDest);
char *str="hello";
len=mystrlen(str);
cout<<len<<endl;
return 0;
}
int mystrlen(const char *StrDest)
{
int i;
i=0;
while((*StrDest++)!='\0')
{
i++;
}//这个循环体意思是从字符串第一个字符起计数,只遇到字符串结束标志'\0’才停止计数
return i;
}
源码一:利用中间变量
int strlen(const char *StrDest)
{
int i;
i=0;
while((*StrDest++)!='\0')
{
i++;
}//这个循环体意思是从字符串第一个字符起计数,只遇到字符串结束标志'\0’才停止计数
return i;
}
源码二:传说某个大名鼎鼎的博士要求面试员写出这样的代码 题目是这样的:
不调用库函数,不使用全局变量和局部变量写出strlen实现。
其实就是要求用递归的方法来写。
int mystrlen(const char *StrDest)
{
assert(NULL !=StrDest);
if(*StrDest == '\0')
return 0;
return (1+mystrlen(++StrDest));
}
递归的过程:当参数传递的过来的地址上内存为'\0',那么就返回0,当不是'\0’就表明地址上存储的是一个字符,那么计数就是1,然后地址加1调用函数本身。当遇到
'\0‘ 结束如此循环。
源码三: 源码二更简洁的方法
int mystrlen(const char*StrDest)
{
assert(NULL != StrDest);
return ('\0'!= *StrDest)?(1+mystrlen(StrDest+1)):0;
}
源码四:
/* strlen: return length of s */
int strlen(char s[])
{
int i;
while (s[i] != '\0')
++i;
return i;
}
源码5:
利用指针加减法(the c programming language一书中提到的)
/* strlen: return length of string s */
int strlen(char *s)
{
char *p = s;
while (*p != '\0')
p++;
return p - s;
}