当前位置: 首页 > news >正文

C语言学习NO.11-字符函数strlen,strlen函数的使用,与三种strlen函数的模拟实现

 (一)strlen函数的使用

 strlen函数的演示

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcdef";char arr2[] = "good";printf("arr1 = %d,arr2 = %d",strlen(arr1),strlen(arr2));return 0;
}

(二)strlen使用的注意事项

• 参数指向的字符串必须要以 '\0' 结束。

• strlen的使用需要包含头文件 <string.h>

• 注意函数的返回值为size_t,是无符号的( 易错 )

//注意函数的返回值为size_t,是无符号的( 易错 ) #include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) > 0)//无符号的两个数相减{printf("str2>str1\n");}else{printf("srt1>str2\n");}return 0;
}

为何输出的结果与预期的不同?

strlen的返回值类型是无符号型,无符号型-无符号型还是无符号型,因此最后的结果一定是大于0的。

因此在比较两组字符串大小时,我们应采用直接比较的方式

(三)strlen的模拟实现

方式1:使用函数模拟strlen

//计数器方式
//使用函数模拟strlen#include <stdio.h>
#include <assert.h>int my_strlen(const char* str)
{int count = 0;assert(str != NULL);//断言  防止str为空指针while (*str)//while (*str != '\0'){count++;str++;}return count;
}int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d", len );return 0;
}

方式2:使用递归的方式

//不能创建临时变量计数器
//3:使用递归方式
#include <stdio.h>
#include <assert.h>int my_strlen(const char* str)
{//assert(str != NULL);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str+1);//疑问:为什么无法使用str++?
}int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d", len);return 0;
}

//疑问:为什么无法使用str++?

答:后置++ 是先使用后自增

所以这里如果这样写 传进去的那个地址值就还是原本的指向

如果用str++ 先使用 后自增 这里的使用表示传参 所以就只会把a的地址传进去 就不符合我们的预期了

这里我们可以调试观察

一、str++的调试结果

在程序进行中,每次进入新阶段前,str的地址发生了改变,但是进入新阶段后,仍是原地址。

二、使用++str的调试结果

str所指向的地址发生了变化。

因此,我们在此处希望由a的地址转换到b的地址,可使用str+1或前置++str的方式。

方式3:指针-指针的方式

//使用指针-指针的方式
#include <stdio.h>
#include <assert.h>int my_strlen(const char* str)
{assert(str);char *s = str;while (*s != '\0')s++;return s - str;//指针-指针=之间元素的个数
}int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d", len);return 0;
}
http://www.lryc.cn/news/279034.html

相关文章:

  • Vue3+ts获取props的值并且定义props值的类型的方法。
  • EasyExcel 不使用科学计数发并以千分位展示
  • 【Python机器学习】SVM——调参
  • 网络传输(TCP)
  • MFC模拟消息发送,自定义以及系统消息
  • 并发,并行,线程与UI操作
  • react 6种方式编写样式
  • 计算机找不到msvcr100.dll的多种解决方法分享,轻松解决dll问题
  • 系分笔记数据库反规范化、SQL语句和大数据
  • php实现支付宝商户转账
  • 并发编程(十一)
  • vue3 指令详解
  • 数据科学竞赛平台推荐
  • 安全防御之安全审计技术
  • C#多窗口那些事儿
  • 记一次 Redis 数据库迁移
  • 小学信息科技Python课程第2课:坐标与画笔
  • BP神经网络(公式推导+举例应用)
  • Word不同部分(分节)设置页眉和页码的使用指南——附案例操作
  • Ubuntu按转发HDF5
  • HCIP OSPF实验
  • Linux上如何一键安装软件?yum源是什么?Linux如何配置yum源?
  • Egg框架搭建后台服务【1】
  • Unity的Camera类——视觉掌控与深度解析(下)
  • 【模型评估 06】超参数调优
  • Matlab 字符识别OCR实验
  • Docker Compose 部署 jenkins
  • QT:使用QStyle实现QMenu的滚动效果
  • 双指针问题——求只包含两个元素的最长连续子序列(子数组)
  • Unity组件开发--短连接HTTP