一.对库函数strlen的理解
在cplusplus网站上搜索strlen
通过对在网站上对strlen的检索可以知道,strlen以下信息
1.这是一个只负责字符串的库函数!
2.计算的是字符串 \0 之前的长度,不包括\0
3.传入的参数只能是指针!
4.返回的类型是size_t类型,本质是unsigned int类型
二.模拟实现库函数strlen
1.计数器法
//1.计数器法 //将字符串的地址传入,找到字符串中每一个不为零的字符并统计 #include<assert.h> #include<stdio.h> #include<string.h> //防止源头字符串被修改,用const修饰 size_t my_strlen(const char* str) { assert(str);//断言传入为非空指针 int count = 0;//计数器 while (*str++) //不为零的字符 { count++; } return count; } int main() { char arr[] = "abcdef"; size_t len=my_strlen(arr); printf("%u", len);//由于是模拟strlen,返回类型是size_t,因此用%u打印 return 0; }
2.递归法
//2.递归法 #include<assert.h> #include<stdio.h> size_t my_strlen(const char* str) { assert(str);//断言传入为非空指针 if (*str == '\0') //控制条件,直到找到了 \0 停止递归 return 0; else //第一个字符不是\0,长度加 1,并向下找下一个字符 return 1 + my_strlen(str + 1); } int main() { char arr[] = "abcdef"; size_t len = my_strlen(arr); //size_t 本质为unsigned int类型 printf("%u", len); return 0; }
3.指针法
//3.指针相减法 //找到字符串起始位置和\0的位置 //指针与指针相减为中间元素个数 #include<assert.h> #include<stdio.h> size_t my_strlen(const char* str) { assert(str);//断言传入的str为非空指针 char* p = str;//记录起始位置 //寻找\0得位置 while (*p) { p++; } return p-str; //指针相减为中间元素得个数 } int main() { char arr[] = "abcdef"; size_t len = my_strlen(arr); printf("%u", len); return 0; }
三.strlen的一些特殊情况
1.字符串中间添加 \0 相当于截断字符串 \0后面的内容
#include<assert.h> size_t my_strlen(const char* str) { assert(str); char* p = str;//记录起始位置 //寻找\0得位置 while (*p) { p++; } return p-str; //指针相减为中间元素得个数 } #include<stdio.h> int main() { char arr[] = "abc\0ef"; size_t len = my_strlen(arr); printf("%u", len); return 0; }
运行结果为: