😁个人主页:小光死嗑C++
😃本人介绍:一名机械生非要找死学计算机,c++爱好者,正在c++道路上探索,愿意拿出一百二十的精力去与C++死磕到底!
😃文章难易程度:本人的文章没有貂蝉那么美,没有吕布那么强,通俗点说,小光的文章并不像那些大牛一样那么神奇,没有那么高深的算法,只是对自己所掌握的内容进行总结、梳理,最后一步一步细细细的写出来。所以不管是入门的小白,还是要复习牛逼的大佬,都是可以非常容易理解的希望各位不要嫌我啰嗦!
😆**结尾:**最后说一点,小光的文章可能会有点不一样,只为了主打你在阅读文字繁多的资料时也可以让你开开心心的浏览!
💖strlen ()函数
首先, strlen() 这个函数是一个计算字符串长度的函数,主要是查看字符串中有多少个字符(额……有点废话了)😁,这个函数是很简单的,但就是这么一个简单的函数,却让我掉了很多次坑😣,下面,介绍大家介绍一下 几个 避坑小知识,话不多说!
发车!!!
在这里下给大家推荐干货一个,函数查找必备网站:https://cplusplus.com/
是非常非常非常重要的!
在这里面,详细的介绍了strlen()函数的使用方法,但是唯一 一点不足的就是全都是英文😂,但是不要怕,小光在这里将中文呈现给各位大哥😁!
就算有了资料介绍,但是,小光仍然要把自己的理解以及一些慢慢的干活分享给各位大哥,望各位慢慢欣赏!
先了解一些strlen() 的用法:
#include <string.h>
int main()
{
char str[] = "abcdef";
int len = strlen(str);
printf("%d\n", len);
return 0;
}
干货一:它只统计‘\0’ 之前有多少个字符,只要没遇见 ‘\0’,他就会一直向后数,直到遇见‘\0’为止!例如:
看!😜就是这样,我们应该知道在字符串中是自带‘\0’的,只是没有显示出来而已,在第二个例子的单个字符数组中里面是没有‘\0’的。谁也不知到后面都放了些什么,只有遇见‘\0’的时候才终止。
这个函数的脾气就是这样,我管你里面放了什么妖魔鬼怪👹,老子就只认识 ‘\0’ ,遇见‘\0’我就停止,说明这个函数看起来还是比较专一的🙄 !
例二:
#include <stdio.h>
#include <string.h>
int main()
{
if (strlen("abc") - strlen("abcdef") < 0)
{
printf("<\n");
}
else
{
printf(">\n");
}
return 0;
}
你觉得只这段代码会输出大于号,还是小于号呢?strlen(“abc”)里面明显有3个字符;strlen(“abcdef”)里面明显有6个字符,所以3-6=-3,所以应该是小于对吧?但是,如果这样想,那你就成功入坑了😄下面运行一下‘
什么?结果竟然输出了 > ,请看小光给您分析返回值:
干货二:stelen() 函数的返回类型是size_t(无符号数),说明两个都是无符号数,相减得到的也是无符号数,所以的出了 > ,是不是只要不注意就很容易入坑呢!各位一定要记住!
💖函数的模拟实现
下面用三种方法为大家模拟实现一下这个函数:
函数的声明:size_t strlen ( const char* str)
1.创建变量
# include <assert.h>
int my_strlen(const char* str)//只数有多少个字符,并不对其修改,所以加const
//如果把类型定义成size_t话,就很容易发生上面的错误但是字符串个数也不会是负数呀,这两个各有利弊!这里写成int
{
assert(str);
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
char str[] = "abcdef";
int ret = my_strlen(str);
printf("%d\n", ret);
return 0;
}
2.递归
int my_strlen(const char* str)
{
assert(str);
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
return 0;
}
int main()
{
char str[] = "abcdef";
int ret = my_strlen(str);
printf("%d\n", ret);
return 0;
}
3.指针减指针
int my_strlen(const char* str)
{
assert(str);
char* aid = str;
while (*aid != '\0')
{
aid++;
}
return aid - str;
}
int main()
{
char str[] = "abcdef";
int ret = my_strlen(str);
printf("%d\n", ret);
return 0;
}
以上就是strlen() 函数的用法了,下面再为大家总结一下注意要点:
1、字符串异‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含‘\0’)
2、参数指向的字符串必须要以‘\0’结束
3、注意函数的返回值是size_t,是无符号的(易错)
以上就是关于strlen()函数的讲解,希望大家喜欢,下面再为介绍一下strlen()的好基友sizeof()😎
💖sizeof()
关于sizeof()和strlen()的故事,它们两个可谓是非常难舍难分(并不是用法上有联系),它们两个经常容易搞错,下面就把它们给彻底区分清楚!
直接发车!!!
先为分享一波干货:
1、sizeof()计算的是占用空间的大小,单位是字节,不关注内存中到底存放了什么,而strlen()计算的是空间中字符的个数(不包括‘\0’)
2、sizeof()是操作符,不是函数,strlen()是函数,只能以char*做参数
3、sizeof ()计算的是类型所占空间的字节数,sizeof(单独一个数组名),以数组名作参数时,计算的是整个数组的大小,而strlen()计算的结果不再是类型所占内存的大小,数组名变成了指针!
sizeof()计算案列:
1、sizeof计算的是分配空间的实际字节数!
还可以通过sizeof来计算数组里有多少个元素(这是我们经常使用的)
2、sizeof()不能计算动态分配空间的大小!
#include <malloc.h>
int main()
{
char* str = (char*)malloc(sizeof(char) * 10);
int len = sizeof(str);
printf("sizeof(str)=%d\n", len);
free(str);
return 0;
}
因为str是一个指针变量,所以sizeof()计算的是指针的大小,指针的大小在32位平台上是4个字节,在64位平台上是8个字节。
另外,还有sizeof计算结构体大小,但是,这里面所涉及到的内容就有一小点点多了,小光会另外再给大家整理出一片文章进行详细的讲解!希望大家多多支持!
本篇文章有什么不满意的地方或者疑问,多多在评论区提出!🥰