9-4. 实现字符串处理函数

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

上一节中,我们认识了一些字符串处理函数,这些字符串处理函数均为系统自带的函数。包含上头文件string.h之后均可使用。

这一节中,我们将运用指针尝试自己实现这些字符串处理函数。以增强我们对指针和字符串的认识。为了区别系统库的字符串处理函数,我们自己的字符串处理函数将添加前缀m

1. 获取字符串长度strlen

strlen的函数原型:

size_t strlen(const char *str);

输入:一个指向字符串首地址的指针。 输出:size_t类型的整型,用于表示字符串长度。

功能:strlen函数可以获取字符数组中的字符串长度。它从第一个字符开始计数,直到遇到'\0'为止,并返回累计的长度。

现在我们模仿strlen函数,写一个功能一模一样的mstrlen函数。

size_t mstrlen(const char *str)
{
    ...
}

为了函数的安全性,强烈建议在函数开始时检查输入参数的有效性。对于指针,检查它是不是一个空指针。

size_t mstrlen(const char *str)
{
    //  如果传入了空,那么直接返回0。
    if (str == NULL)
    {
        return 0;
    }
    ...
}

接下来,我们设置一个计数变量len,初始值为0,表明初始长度为0。接着,我们将遍历str字符串,直到str所指向的字符为'\0'为止,每经过一个字符,len加1。

size_t mstrlen(const char *str)
{
    ...

    //  长度从0开始累计
    size_t len = 0;
    //  计算长度
    while(*str != '\0')
    {
        len++;  //  当前字符不为'\0',计数器加1
        str++;  //  str指向下一个字符
    }
    return len;
}

完整代码如下:

size_t mstrlen (const char *str)
{
    //  如果传入了空,那么直接返回0。
    if (str == NULL)
    {
        return 0;
    }

    //  长度从0开始累计
    size_t len = 0;
    //  计算长度
    while(*str != '\0')
    {
        len++;  //  当前字符不为'\0',计数器加1
        str++;  //  str指向下一个字符
    }
    return len;
}

我们使用下面的代码来测试mstrlen函数是否正确。

int main()
{
    size_t len;
    //  空指针为输入
    len = mstrlen(NULL);
    printf("%d\n", len);

    //  空字符串输入
    len = mstrlen("");
    printf("%d\n", len);

    //  字符串Hello输入
    len = mstrlen("Hello");
    printf("%d\n", len);

    return 0;
}

在做测试时,一定要注意一些异常和边界条件。比如NULL作为输入,空字符串""作为输入。函数必须可以很好地处理这些异常和边界条件才算一个好的实现。