【C语言】my _strlen函数功能的实现
一:创建变量来实现my_strlen(char *str)函数功能
先引入一个程序:
#include <stdio.h>
#include <stdlib.h>
int my_strlen(char * str)
{
int count = 0;
if(str == NULL)
{
exit(EXIT_FAILURE);
}
while(*str++ != " ")
{
count++;
}
return count;
}
int main ()
{
char *p = "andef";
int ret = my_strlen(p);
printf("%d
",ret);
return 0;
}
上面的程序你觉得好吗?如果满分10分,也许你只能拿到5分,甚至不及格。
(1)若函数定义int my_strlen(char * str)中不加const,那么从主函数中传的实参p的内容在函数定义时就可以很容易被改变,如果加了const,一旦实参的值被改变编译器就会报错。
(2)若实参是一个空指针,你觉得编译时会报错吗?不会的!而且函数里用if语句来检测NULL,无论实参是否为NULL,一调用函数时都得对实参进行判断,若实参不为NULL,那么我们就不需要进行判断了。这就引入了断言函数,assert:有规则地判断指针的有效性,帮助程序员很好定位问题,但它不会为程序员解决问题。如果我们用assert(str != NULL);代替if语句,那么assert函数就会有规则地帮我们进行判断,若实参不是NULL,则直接跳过assert函数,并执行下一条指令;如果是实参NULL,那么就要引入Release版本和Debug版本了,在Release版本下,运行编译器不会报出错误;而在Debug版本下,编译器就会报出错,说明问题错在哪儿。我们一般在Release版本和Debug版本下使用assert函数,Debug称为调试版本,它包含调试信息,但它不做任何的优化,便于程序员调试程序;Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。
经过分析后,我们看一下这个函数应该怎么写。
#include <stdio.h>
#include <assert.h>
int my_strlen(char const * str)
{
int count = 0;
assert(str != NULL);
while(*str++ != " ")
{
count++;
}
return count;
}
int main ()
{
char *p = "andef";
int ret = my_strlen(p);
printf("%d
",ret);
return 0;
}
这样的程序,刚入门时能这样写已经不错了!
在使用断言函数时必须引入头文件assert.h!
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C语言中的strlen实现方法
- 下一篇: strlen函数实现源码与解析。