strlen函数的实现

来源:互联网 发布:音画不同步修正软件 编辑:程序博客网 时间:2024/05/03 12:51

strlen函数作为一个在面试经常被问到的问题,相信在不少求职的面经经历中都有强调

首先看一下strlen函数的作用和基本的作用:计算字符串的长度而不包括结束志'\0';由此我们又可以联想到与他相类似的相对应的另一个关键字sizeof(计算字符串的长度,且包括结束标志‘\0’),在此我只是提一下sizeof,下面继续来探讨有关strlen函数的使用。

最基本的一点是在使用strlen函数时,首先就要注意别忘了加头文件#include<string.h>

下面我们下来看第一组代码实现:

#include<stdio.h>
#include<string.h>
int main()
{
int i=0;
char ch[10];
printf("请输入一个长度小于十的字符串:\n");
gets(ch);
for(i=0;i<10;i++)
{
if(ch[i]=='\0')
break;
}
printf("%d\n",strlen(ch));
}


很显然通过strlen函数求字符串的长度还是蛮成功的,那么如果题目要求我们不能使用strlen函数还要实现strlen函数的功能时,我们又该如何来写,其实并不难我们只需要将上面的输出做一简单的调整就可以实现,我们将刚才的输出屏蔽掉,两者做一对比,下面代码实现:

#include<stdio.h>
#include<string.h>
#include<assert.h>
int main()
{
int i=0;
char ch[10];
printf("请输入一个长度小于十的字符串:\n");
gets(ch);
for(i=0;i<10;i++)
{
if(ch[i]=='\0')
break;
}
//printf("%d\n",strlen(ch));
printf("字符串长度为%d\n",i);
}


当你看到黑框中的运行结果时,你可能已经感叹出了一句“呵呵”,这有啥难的,可是如果此时面试官告诉你,你写的不错不过我只能给你一半的分,你看看程序还能不能在优化,否则我也只能“呵呵”的跟你说“回去吧,你学的还不够”。下面我们在在刚才的思路上进行调整:

int my_strlen(char *str)
{
int count=0;
while(*str!='\0')
{
count++;
str++;
}
return count;
}

这段代码是属于自己编的一个类似于strlen函数使用方法的代码,但是当你写到这块时,面试官又会再来一句还可以那就给你70%的成绩,你看看还有什么可以优化的地方,或许你此时已经心里打呼面试官好坑呀,非要把你问死(哈哈),没办法这就是面试官,下面请看代码的最终调整过程:

#include<stdio.h>
#include<string.h>
#include<assert.h>

int my_strlen(const char *str)
{
int count=0;
assert(str!=NULL);   
while(*str!='\0')
{
count++;
str++;
}
return count;
}

int main()
{
char *p="abcdef";
int len=0;
len=my_strlen(p);
printf("%d\n",len);
return 0;
}

当你写出这段代码时,此时面试官或许才会露出微笑,表示小伙子写的不错,来看一下最后这段代码中新的改进内容,首先加了一个const保证不需要修改时它是安全的。然后加了一个断言assert(assert()宏是用于保证满足某个特定条件,如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。 )。

最后让我们在进到库函数中看看一看公司大牛编写的有关strlen函数的实现:

int my_strlen(const char *str)
{
assert(str);
if(*str=='\0')
{
return 0;
}
else
{
return 1+my_strlen(str+1);
}
}

对比我们上面的函数实现,下面函数的有点在于少创建了变量,用递归调用的方法来实现有关的功能,好了看了这么其实我们和那些大牛的差别还很大,fighting吧,go!go!go!

0 0
原创粉丝点击