C语言strlen函数详细讲解

  • Post author:
  • Post category:其他


1.strlen函数的功能和字符串的基础知识

计算字符串的长度,返回的是字符串长度,准确来说,返回的是字符串中’\0’之前的字符个数(不包含’\0’),并且是无符号类型。

在C语言中,没有字符串这种变量类型,一般用两种方法实现。一是用双引号生成常量字符串再赋值给一个指针,指针指向的是该常量字符串的首字符地址;二是利用字符数组,把字符存储在数组中。值得注意的是,利用字符数组创建字符串的时候记得把’\0’存进去(’\0’本身是一个字符,占一个字节),因为很多对字符进行操作的库函数或多或少都跟’\0’有关系,或者说’\0’是字符串结束的官方标志。

2.函数声明的详解

size_t strlen ( const char * str );

2.1.首先函数名,没什么解释

2.2.函数接受的参数,我们要计算字符串的长度,所以传入字符指针或者字符数组,并且希望不要随意改动我们需要操作的字符串(用const 修饰)

2.3.默认规定计算的字符串长度是非负的,所以返回类型是size_t(同unsigned int)。但这一点会在使用中产生一些按常理思考会犯的错误,以下面这个代码为例

#include<stdio.h>
#include<string.h>
int main()
{
    // 初始化两个不可更改的字符串常量
    const char* str1 = "abcdef";
    const char* str2 = "bbb";
    if(strlen(str2) - strlen(str1) > 0)
    {
        printf("str2的长度更长\n")
    }
    else
    {
        printf("str1的长度更长\n")
    }
    return 0;
}

如果你稍不注意,你就会觉得上面代码的输出结果是str1的长度更长,可实际上输出的结果确是str2的长度更长,这就是strlen函数的返回类型是size_t类型导致的。

3.自己编程实现strlen函数的功能

在理解了字符串的一些性质和库函数strlen的声明之后,我们就可以自己按着自己的想法去实现功能,比如我们要让上面这个代码输出的结果符合大众的思维,我们就可以编写如下的代码:

// 方法1
int my_strlen(const char* str)
{
    int count = 0;
    // 从第一个字符开始解引用,边解引用边与'\0'比较
    // 由于对于字符来说都是一定的ASICC码值'\0'就是0
    while(*str != '\0')  // 另外一种写法(while(*str))
    {
        count++;  // 只要循环能够进来,就代表有一个非'\0'的字符,所以计数器加一
        str++;    // 利用指针的加法,使得指针指向下一个字符
    }
    return count;
}

利用一点递归的知识也可以实现该函数的功能,用递归的思想编程时,我们要牢记设计程序出口和自己调用自己两个最主要的原则,这里不对递归进行仔细地讲解,让我们直接来看使用递归怎么实现strlen函数的功能的吧。

int my_strlen(const char* str)
{
    // 因为我们去计算的字符个数的时候,结束的标志都是遇到'\0',并且把每个字符都拿来比较
    // 那么只要不是'\0'我们就加1
    if(*str == '\0')
        // 设计出口
        return 0;
    else
        // 自己调用自己,这时候要求看指针指向的下一个字符了
        return 1 + my_strlen(str+1) 
}

4.总结

对于大多数对字符串进行操作的函数,最重要的就是找到字符串的特点,也就是’\0’。在知道操作对象特性的基础上,我们才能更好地实现自己想要的函数功能。



版权声明:本文为m0_57121135原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。