字符串统计:strlen函数的讲解,及其模拟实现

简介: 字符串统计:strlen函数的讲解,及其模拟实现

1.函数介绍:


 求字符串长度(strlen函数)


对于strlen 统计的是在字符串中 ‘\0'之前出现的字符个数(不包含'\0')


请参考代码:


#include <stdio.h>
#include <string.h>
int main()
{
  // a b c d e f \0 一共7个元素
  char arr[] = "abcdef";
  printf("%d\n", strlen(arr));
  return 0;
}

代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


上述代码中:char arr[] = "abcdef";  一共有     a b c d e f \0 一共7个元素    ,但是当\0的位置在:


a b c \0 d e f  的时候,代码的运行结果为:


2d65d23f6d4748949b924e4057485923.png


对于:char arr[]={'a','b','c'};此时:代码的运行结果就是随机值了!! 代码的运行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


在上述的代码中,多次使用到了strlen函数!!下面笔者对strlen这个函数进行讲解:


12c3b7f3f8814309a195c64f051d4445.png


size_t strlen (const char* str)

const char* str  :指针—》地址—》首字符的地址!


对于strlen函数,本文主要有一下讲解!!


1.参数指向的字符串必须以'\0'结束!


2.注意函数的返回值为:size_t类型(无符号的整型)易错部分,紧急必坑!!


3.学会strlen函数的模拟实现!!


证明:返回值为size_t (无符号整型)!


请看笔者代码:


#include <stdio.h>
#include <string.h>
int main()
{
  if (strlen("abc") - strlen("abcdef"))
  {
  printf(">\n");
  }
  else
  {
  printf("<\n");
  }
  return 0;
}


这个代码中:strlen("abc") - strlen("abcdef")  对于该字符串的大小,想必读者肉眼都能看清楚!3-6=-3!!!直接的想法便是:'<'  ;那么便是大错特错了!!怎可能会是按照这样的想法来呢??


请看打印的结果:


34e8d716411043c08c7ffba9fbba23de.png


若有不相信的读者,可以自行尝试!!


原因在于:打印的结果为:size_t类型(无符号的整型)!!对于无符号数-无符号数=无符号数!想必读者没有多大的疑问吧!!


因此,可以总结的来说!字符串的长度不可能为负数!所以,strlen函数为无符号数!


下面笔者来对strlen函数进行模拟实现!!请各位老铁仔细欣赏!!走神将会错过好戏!


#include <stdio.h>
#include <string.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
  assert(str);
  const char* start = str;//记录起始地址
  const char* end = str;  //记录结束地址
  while (*end != '\0')
  {
  end++;
  }
  return end - start;  //结束时候的位置减去起始位置等于中间的字符个数
}
int main()
{
  char arr[] = "abcdef";
  int len = my_strlen(arr);
  printf("%d\n", len);
  return 0;
}


在上述代码中:笔者对strlen统计字符串长度的函数来进行模拟实现了一下!!


1.对于在main函数里面:这里的int len = my_strlen(arr);  arr是指:起始地址,即'a'的地址!!


2.对于size_t my_strlen(const char* str) 是按照strlen 函数的类型来进行定义的!!偷偷告诉各位老铁一句:不能将size_t换为void  ,若是进行替换将会出现错误!!对于:const char* str 是用指针来进行接收,前面加了const  是指对arr不能进行修改,这样显得更加完美!const 修饰的是:* str !


3.对于    assert(str);  断言,保证str 不为空指针!!因为,在后面有部分代码是对:str进行*(解引用操作)所以要确保str不为空指针!


4. 在while循环里面,end为什么能进行++操作呢??原因在于:const修饰的是:*end, 并没有限制end  !!但是,对于const * char end 这样进行书写,将会限制end进行++操作!!


5.end - start  :两个指针相减,得到的是两个指针之间的元素个数!!即字符串的长度!


代码的运行结果为:


92ba0822ed0b46e1ae72df8a17d3a45b.png


对于字符串统计:strlen函数的讲解,及其模拟实现 部分就到此结束,各位老铁,若有不同的想法,请及时联系笔者!!将会竭尽全力帮助各位老铁度过难关!


相关文章
|
6月前
[字符串和内存函数]strcmp字符串函数的详解和模拟
[字符串和内存函数]strcmp字符串函数的详解和模拟
51 1
|
6月前
|
C语言
[字符串和内存函数]strcat字符串函数的详解和模拟
[字符串和内存函数]strcat字符串函数的详解和模拟
46 0
|
C语言
strlen函数【详解+模拟实现】
strlen函数【详解+模拟实现】
|
5月前
atoi函数(想要彻底了解atoi函数,那么看这一篇就足够了!)
atoi函数(想要彻底了解atoi函数,那么看这一篇就足够了!)
|
6月前
|
程序员 C语言
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
41 0
strstr函数的使用及模拟实现
1.strstr函数 2.strstr函数的使用 3.strstr函数的模拟实现
139 0
|
6月前
|
PHP C++
[字符串和内存函数]strcpy和strlen字符串函数的详解和模拟
[字符串和内存函数]strcpy和strlen字符串函数的详解和模拟
66 0
下列给定程序中函数fun的功能是:统计substr所指的子符串在str所指的字符串中出现的次数。
下列给定程序中函数fun的功能是:统计substr所指的子符串在str所指的字符串中出现的次数。
|
存储 Serverless
strlen函数解析与模拟实现
strlen函数解析与模拟实现
strlen函数解析与模拟实现
strlen函数的两种模拟方法以及使用
strlen函数的两种模拟方法以及使用