牛骨文教育服务平台(让学习变的简单)
博文笔记

【C语言】my _strlen函数功能的实现

创建时间:2015-04-14 投稿人: 浏览次数:1853

一:创建变量来实现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!

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。