strlen函数【详解+模拟实现】

简介: strlen函数【详解+模拟实现】

什么是字符串

字符串 - 是程序设计中的表示文本的一种数据类型。

在一般使用的字符串中,分为常量字符串变量字符串

常量字符串 - 即不可被修改的字符串

char*ar1 = "abcdefg";
"sdsdsdsdsd";

该处的两个字符串即为常量字符串 - 不能对值进行修改


char arr[] = "hello world";
char a = 'c';

该处的arr与a即为变量字符串(字符) - 即可对值进行修改

一般来说,C语言本身是没有字符串类型的,且字符串通常放在常量字符串中或者字符数组中


求字符串长度 - strlen函数

在字符串的处理当中,我们经常需要使用到字符串的长度,除了sizeof操作符(返回一个对象或者类型所占的内存字节数)以外,在c语言库函数中,也存在一个可以用来求出字符串长度的函数strlen函数(string.h文件中)。


strlen函数的使用

#include<string.h>//使用字符串函数应该包含<string.h>文件
#include<stdio.h>
void test1()
{
  char arr[] = "abcdef";
  int ret = strlen(arr);
  printf("%d\n", ret);//打印结果为6
}
int main()
{
  test1();
  return 0;
}

若是存在以下代码,该代码的输出是什么?为什么?

void test2()
{
  char arr1[] = "abcd";
  char arr2[] = "abcdefg";
  if (strlen(arr1) - strlen(arr2) < 0) {
    printf("<\n");
  }
  else printf(">\n");
}

当程序运行,我们可以发现结果为:

为什么结果不为 “<” ???


从cplusplus网站中可以看出,strlen函数是传入一个char*的指针且返回的是一个size_t的值(无符号)的值

在上面的代码中,arr1的长度为4,arr2的长度为7,相减即为 -3

strlen函数返回的是一个无符号的数,即将 -3 看为一个无符号的数。

-3 :

原码为 1000 0000 0000 0000 0000 0000 0000 0011

反码为 1111 1111 1111 1111 1111 1111 1111 1100

补码为 1111 1111 1111 1111 1111 1111 1111 1101

因为返回值为size_t类型,即将-3的补码当成原码进行计算

故打印为">"


strlen函数的原理

了解到了strlen函数返回的是一个size_of的值,且返回的值为该字符串’\0’之前的字符个数,既然如此,那么这里有一个问题

strlen函数的计算方式是到’\0’为止?

还是字符串个数中只是不包括’\0’的个数?


存在以下代码:

该代码打印出的结果是什么?

void test()
{
char arr[] = "abcd\0efgh\0ijk";
printf("%d\n",strlen(arr));
}

从打印结果可以大概推断出,strlen函数计数的是’\0’之前出现的字符,当该函数一个个字符查找知道找到’\0’则停止。

strlen函数的模拟实现

李姐到了strlen函数的原理,那是否能根据strlen函数的原理模拟出一个strlen函数?


可以!

根据strlen函数的原理,我们可以思考几种方法:

  1. 计数器:

创建一个变量作为计数器,且遍历字符串;每遍历一个非’\0’时,计数器变量+1;

size_t my_strlen_count(char* p)
{
   size_t count = 0;//创建一个计数器变量
   while (*p++ != '\0') {//遍历整个字符串
    count++;//每当遇到一个非'\0'的字符则计数器+1
   }
   return count;
}
void test1()
{
   char arr[] = "abcdef";
   int ret = my_strlen_count(arr);
   printf("%d\n", ret);
}
int main()
{
   test1();
   return 0;
}

  1. 递归:

使用递归函数来遍历整个字符串,当不为’\0’则返回1+递归该函数,为’\0’则返回0;

size_t my_strlen_recur(char*p)
{
   if (*p != '\0') {
    return 1 + my_strlen_recur(p + 1);
   }
   else {
    return 0;
   }
}
void test2()
{
   char arr[] = "abcdef";
   int ret = my_strlen_recur(arr);
   printf("%d\n", ret);
}
int main()
{
   //test1();
   test2();
   return 0;
}

  1. 地址-地址:

使用地址-地址的方法即为创建一个指针变量,并使该指针遍历整个字符串,直到找到’\0’,再用后面的指针减去前面的指针得到的即为之间字符的个数。

size_t my_strlen_dest_src(char* p)
{
  char* pp = p;
  while (*++pp != '\0') {
    ;
  }
  return pp - p;
}
void test3()
{
  char arr[] = "abcdef";
  int ret = my_strlen_dest_src(arr);
  printf("%d\n", ret);
}
int main()
{
  //test1();
  //test2();
  test3();
  return 0;
}
相关文章
|
8月前
strstr函数的使用及模拟实现
1.strstr函数 2.strstr函数的使用 3.strstr函数的模拟实现
71 0
|
5月前
atoi函数的模拟实现
atoi函数的模拟实现
|
5月前
模拟实现库函数strlen
模拟实现库函数strlen
15 0
|
9月前
strlen函数的两种模拟方法以及使用
strlen函数的两种模拟方法以及使用
|
9月前
模拟实现atoi函数
模拟实现atoi函数
|
9月前
三种方法模拟实现库函数strlen,加深对strlen的理解
三种方法模拟实现库函数strlen,加深对strlen的理解
|
10月前
|
存储 Serverless
strlen函数解析与模拟实现
strlen函数解析与模拟实现
strlen函数解析与模拟实现
|
12月前
模拟实现strlen
模拟实现strlen
|
12月前
|
编译器 C语言 C++
模拟实现strcmp
模拟实现strcmp
|
12月前
模拟实现strcpy
模拟实现strcpy