【strlen】三种方法模拟实现strlen字符串函数
2023-06-13 09:16:43 时间
奇妙的字符串之旅
文章目录
模拟实现“求有效字符长度”的函数my_strlen
由于主函数都一样,现统一给出
int main()
{
char arr[]="abcde";//5个可见(有效)字符
int len=my_strlen(arr);//len接收返回值
printf("%d\n",len);
return 0;
}
方法一:计数器法
int my_strlen(const char*str)
{
int count=0;
while(*str++)//先运算后++
{
count++;//计数
}
return count;
}
备注:此处的函数返回值按照标准理应该size_t也就是unsigned int 返回值为Int 的优缺点: 优点:不会产生由使用size_t(坑坑坑)引发的问题 缺点:不符合size_t类型的返回值的取值范围(数据类型的取值范围)
运行结果:
const作用:对于不打算修改的变量进行保护,防止被修改。 1.const写给程序员看:自解释,防止后面不小心修改str的值 2.const写给编译器看:一旦修改,立即报错,方便找bug
方法二:函数递归法
递归出口:末尾\0
不了解递归:速戳:递归
int my_strlen(const char* str)
{
if(*str)
{
return 1+my_strlen(str+1);
}
else
{
return 0;
}
}
方法三:指针相减法
元素个数=(指针1-指针2)/sizeof(数据类型)
int my_strlen(const char* str)
{
const char* start = str;//把安全(const)的指针交给安全(const)的指针
while (*str)
{
str++;
}
return str - start;
}
以上三种方法都可得出结果5
备注:如果方法三为了优化代码而优化代码写成了这样是有问题的
解释: while(str++)中把’\0’放在()内在str==‘\0’的时候,跳出循环前还是会进行从左向右执行最后一次的++操作,然后再跳出; 但是 while(*str) { str++; } 把++放在while的代码块{}内,跳出循环是不会再进行从左向右执行最后一次的++操作,而是直接跳出。
举一个例子验证:
但是这个问题可以优化到正确的答案:只用在return 返回值处再减去1
备注:我的博客中还有其他字符串函数的相关模拟实现,快来围观吧!
相关文章
- 【说站】python scrapy模拟登录的方法
- Python模拟自动登陆网页的三种方法!
- 2023最新Mac电脑释放内存空间教程方法
- 台积电公布将模拟设计迁移到3nm的方法
- 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )
- apache 配置模拟外网环境开发网站的方法
- HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端编程语言
- Oracle 等待事件 Redo Transport Ping 官方解释,作用,如何使用及优化方法
- Oracle 等待事件 Enqueues:SN,SequenceNumber 官方解释,作用,如何使用及优化方法
- PHP查看xml源码的方法详解编程语言
- Linux中使用通配符的有效方法(linux中通配符)
- Oracle 数据库自动清理表碎片的方法及意义(oracle清理表碎片)
- MySQL实现模拟序列的方法(mysql模拟序列)
- MySQL下载及账号密码获取方法简介(mysql 下载账号密码)
- 优化Redis配置优化,节省内存的有效方法(redis配置占用内存)
- js模拟实现Array的sort方法
- javascript模拟JQuery的Ready方法实现并出现的问题
- ASP.NETrepeater添加序号列的方法
- 登录oracle数据库时密码忘记的解决方法
- PHP读取CURL模拟登录时生成Cookie文件的方法
- Python采用socket模拟TCP通讯的实现方法
- 升级到mac10.10之后使用pod出现问题的解决方法
- asp.net访问网络路径方法(模拟用户登录)
- java中使用数组进行模拟加密的方法