欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言-字符串函数的实现(一)之strlen

程序员文章站 2022-03-07 15:14:30
C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp 字符串查找 strstr strtok 错误信息报告 strerror 接下来看看如何实现它们 获 ......

c语言中的字符串函数有如下这些

  • 获取字符串长度
    • strlen
  • 长度不受限制的字符串函数
    • strcpy
    • strcat
    • strcmp
  • 长度受限制的字符串函数
    • strncpy
    • strncat
    • strncmp
  • 字符串查找
    • strstr
    • strtok
  • 错误信息报告
    • strerror

接下来看看如何实现它们

获取字符串长度

strlen

我们看看文档是怎样说的,如下

size_t strlen ( const char * str );

get string length

获取字符串长度

returns the length of the c string str.

返回c字符串str的长度

the length of a c string is determined by the terminating null-character: a c string is as long as the number of characters between the beginning of the string and the terminating null character (without including the terminating null character itself).

c字符串长度是由'\0'来确定的,也就是说从字符串的第一个开始只要遇到'\0'就结束长度计算(不包含'\0')

this should not be confused with the size of the array that holds the string. for example:

不用困惑你创建的数组的大小,比如这样

char mystr[100]="test string";

defines an array of characters with a size of 100 chars, but the c string with which mystr has been initialized has a length of only 11 characters. therefore, while sizeof(mystr) evaluates to 100, strlen(mystr) returns 11.

定义一个大小为100的数组mystr,然后mystr 就已经被初始化为一个长度为11的字符串了。所以呢, sizeof(mystr) 会得出 100, 而strlen(mystr) 会返回 11.

综上,可以知道

  1. 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
  2. 该函数只认'\0',参数指向的字符串必须要以 '\0' 结束。
  3. 注意函数的返回值为size_t,是无符号的

实现

strlen函数的实现有好几种。

比如

  1. 计数器的方法
  2. 递归
  3. 指针 - 指针

接下来一一实现。

1. 计数器:使用一个变量来记录 - count

断言指针不为空是个好习惯~

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

就一直找'\0',当*str不是'\0'时,就count++,str++,直到遇到'\0'停止,然后返回count就是长度了。

2. 递归

断言指针不为空是个好习惯~

int my_strlen(char* str)
{
    assert(str != null);
    char* p = str;
    while(*p == '\0')
    {
        return 0;
    }
    return 1 + my_strlen(p + 1);
}

比如传入的str地址为 1000

那么 1 + my_strlen(p + 1) 中,p + 1,指针偏移后就是1001,以此类推。

1 + 1 + my_strlen(p + 1)

1 + 1 + 1 + my_strlen(p + 1)

1 + 1 + 1 + 1 + my_strlen(p + 1)

...

1 + 1 + 1 + 1 + ... + 0

最终就可以得出长度。

3. 指针-指针

断言指针不为空是个好习惯~

int my_strlen(char* str) 
{
    assert(str != null);
    char* p = str;
    while (*p != '\0') 
    {
        p++;
    }
    return p - str;
}

把指针str的地址赋值给一个新的指针p,str作为指向起始地址的指针,不改变它,记录起始地址。

然后通过指针p进行查找'\0',判断当前字符是否为'\0',不是就进行p++,然后继续判断下一个字符,如此循环,直到指针p找到'\0',然后用 当前的指针p 减去 起始指针str 进行返回,就是长度了。

最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客有帮到你

你轻轻一个赞,就是我世界里的一颗星

还有因本人水平有限,如有错误以及不足之处,欢迎靓仔靓女们指出。