面试可能遇到的strlen
避免和库中的函数冲突,函数都命名为my_strlen;
//1.首先是常规实现方法
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strlen(const char* str)
//关于const,后面学到C++时会详细写一篇const的博客。
{
int count = 0;//设置计数器
assert(str);//断言 参数指针是否为空,后面不再注释
while(*str)
{
str++;
count++;
}
return count;
}
int main()
{
char *str = "abcdef";
printf("%d\n",my_strlen(str));
system("pause");
return 0
<span style="font-size:18px;color:#ff0000;">//2.
//同样需要创建临时变量
//运用指针相减
//直接上算法,主函数省略
</span></span>
int my_strlen(const char *str)
{
const char *tmp = str;//保存起始位置,注意tmp也需要用const修饰
while(*str)
{
str++;
}
return str-tmp;
<span style="font-size:18px;color:#ff0000;">//插入一个知识点:
// 比如同一个数组arr[10] = {0}中,
// &arr[10]-&arr[0]的结果是 10;
// 因为在这里上式等价于:arr+10-(arr+0);
// 这里的10是 sizeof(int)*10;
// 所以这里的指针相减所得到的结果是这两个指针间元素的个数;</span>
</span> }
//3.
//面试官肯定不会就这样放过你;
//一般会再问你如果不创建临时变量是否可以实现strlen?
//你肯定可以想到递归吧!
//这里就有个小技巧了,
//一般面试官要求写strlen 时不要着急就把最优化的方法写出来,
//可以等面试官继续发问,然后思索一下在写出来;
//这样会让面试官觉得你的反应能力迅速。
//有点套路的意思了,嘿嘿!
//直接上代码吧!
//面试官肯定不会就这样放过你;
//一般会再问你如果不创建临时变量是否可以实现strlen?
//你肯定可以想到递归吧!
//这里就有个小技巧了,
//一般面试官要求写strlen 时不要着急就把最优化的方法写出来,
//可以等面试官继续发问,然后思索一下在写出来;
//这样会让面试官觉得你的反应能力迅速。
//有点套路的意思了,嘿嘿!
//直接上代码吧!
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strlen(const char *str)
{
assert(str);
while(*str)
{
return 1+my_strlen(str+1);//递归调用
}
return 0;
}
int main()
{
char *str = "abcdef";
printf("%d\n",my_strlen(str));
system("pause");
return 0;
}
写的不好,请多多指教!