strlen和sizeof的初步理解
大家好我是Beilef,一个美好的下我接触到编程并且逐渐喜欢。我虽然不是科班出身但是我会更加努力地去学,有啥不对的地方请斧正
文章目录
前言
想必大家对sizeof肯定很了解,那对strlen又了解多少。其实这个问题应该让不少人困扰。因为我以前也很困扰。甚至感觉他俩差不多,虽然确实有相似之处。
提示:以下是本篇文章正文内容,下面案例可供参
考
一、strlen的用法
strlen是c语言库的一个函数,当然啦其他语言也存在。
【strlen]函数所做的是一个计数的工作,它从被指定的地点一直向后数,一直等遇到\0为止。并且返还这一个空间中\0以前的元素个数,不在乎元素的类型大小,只在于元素的个数是多少位。这期间返还的是无符号整型数
1.strlen函数的原理解析
size_t strlen( const char *string )
strlen函数的返回值是【size_t],这是一个无符号类型的整数(unsigned int)。
也就是说我们用了strlen函数就是为了找一个空间内的元素的位数所以strlen不会耍些花的,一定返还一个数值即为元素位数。
?2、它的函数参数为:(const char* string)我们可以怎么理解:由const修饰的指向string(字符串)首元素地址的字符指针。
看到这,真相也大白了:strlen函数所作用的对象是字符串!原因也很直接,因为函数规定:由某个指定位置向后逐个扫描计数,直到遇到'\0'停止并返回计数。我们回想一下:数组与字符串二者谁是以’\0‘结尾呢??
?
? ? ? ? ? ? ? ? ? ? ? ? ? ??只有字符串是以\0结尾的!
?3.strlen的用法
其实strlen的用法非常方便,我们只需将这一段的字符串名放进去然后让strlen函数自己去计算
然后我们用整形去接受最后的值就可以。
#include<stdio.h>
int main()
{
int count = 0;
char vate[] = "You can do it!";
count = strlen(vate);
printf("vate的长度是:%d", count);
return 0;
}
?大家这里看看这个答案是A11? B12? C13? ?D14
?
答案是14 ,当时我也很懵圈后来才知道空格也算字符
?我们知道如何使用strlen函数后,接下来知道strlen函数的3种模拟实现方法(计数器法? 递归法,指针法。)我们来看看吧(小弟水平有限指针法就不讲了,希望放过)
?
?(一)计数器法
?计数器法是最简单最直观的方法,当然特是最好使用的一个(本人觉得)
#include <stdio.h>
int my_strlen(const char*arr)
{
int count = 0;
while (*arr++ != '\0')
{
count++;
}
return count ;
}
int main()
{
int count = 0;
char arr[10000] ;
scanf("%s", arr);
count = my_strlen(arr);
printf("%d", count );
return 0;
}
?为了能更好的理解这个方法我们来举个例子
my_strlen函数中,字符串就像一群在桥下游过的小鸭子,而count变量就像一个在桥上数鸭子的小朋友,每经过一只鸭子,小朋友用指头计一个数。但鸭子总会全部游过去,小朋友该怎么停止计数呢?
我们只需要告诉小朋友只要看到小鸡🐥就停下来,哈哈,没错,\0就是那个小鸡
?字符串在传参的时候,传出的是字符串的首地址。函数接收后依旧是那个地址,它可以提供给函数访问一直到遇见\0为止。
?代码来喽!!
void my_strlen(const char* vate)
{
printf("%s\n", vate);
}
int main()
{
int count = 0;
char vate[] = "You can do it!";
my_strlen(vate);
return 0;
}
?如果改变了首元素那么就会打印空白。为什么呢
在主函数中,vate字符串的空间已经在内存中被开辟,如果按照正常情况:传址——接收——顺序访问,过程应该是很丝滑的。而在 函数中对首元素的修改,让这个字符串指针与后面数据断开了联系,你想让它在修改后再输出原来的数据,这几乎是不可能的。
?就像一群狼群,你把头狼换了后面的狼肯定不服,就会出现重新选择头狼。在这里就是没有结果打印。
2、有了第一点后,我们已经可以保证我们可以访问这个字符串的全体了,那么接下来我们就需要进行一个while循环条件的设定:如果没有访问到字符串中的‘\0‘(*vate++ != '\0'),就一直得逐个向后访问。
3、最后呢,我们需要安排一个变量,用于每一次进入循环后的++;因为能够进入到循环中,则说明这个元素是非\0的。
?二,递归法
递归真的是个很奇妙的的东西,很多人都淹没在递归的用法中。当然哥哥,俺也一样!!
当我还在迷惑中时突然听见耳畔传来一句话,出来混迟早要还的。递归就像一个回旋镖,不管你仍的多远它终究会回来。一来一回就是递归。
?没错又是代码!!
int my_strlen(const char* vate)
{
assert(vate != NULL);
if (*vate == '\0')
{
return 0;
}
else
{
return 1 + my_strlen(vate + 1);
}
}
int main()
{
int count = 0;
char vate[] = "You can do it!";
count = my_strlen(vate);
printf("vate的长度是:%d", count);
return 0;
}
?代码的输出还是14,这里就不放了
如果指针vate中的元素不等于'\0',那么进入到else语句:将指针往后移动一位。再次进入if语句中判断,如果找到'\0\,那么return 0。
?总结一下O(∩_∩)O
1、主函数将字符串名传入函数,而字符串名则代表的是字符串的首元素地址,故函数使用指针接收。
2、递归的使用一定要满足两个要点,才算是一个“入门级”的递归。(第一:要设置一个“出口”条件。第二:要让递归无限向出口条件靠近。)
?二,sizeof(来咯来咯,他真的来喽)
?老样子来一个用法
sizeof的用法如下:
sizeof是C/C++中的一个操作符,用于返回一个对象或者类型所占的内存字节数
1。sizeof有两种语法形式:
sizeof(type_name):用于获取类型所占的字节数。如sizeof(int)。
sizeof(object)或sizeof object:用于获取对象所占的字节数。如sizeof(var_name)或sizeof var_name。变量名可以不用括号括住,但带括号的用法更普遍2。sizeof操作符不能用于函数类型、不完全类型或位字段。如sizeof(max)若此时变量max定义为int max(),则不是正确形式
3。?sizeof计算对象的大小时,同种类型的不同对象其sizeof值都是一致的
4.sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。如sizeof(2+3.14)等价于 sizeof(double)。
5.sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。
6.C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值3。
注意:在使用sizeof时,需要包含头文件stdio.h4。
strlen函数与sizeof操作符有什么区别呢?
其实,strlen函数是专门用来计算字符串元素的数量,而sizeof则是用来计算数据类型的大小,两者或许根本搭不上边,但因为C语言语法的自由度高,各位大佬们创造出了以下语句,便让sizeof操作符也可以计算出元素的数量:
sizeof(arr)/sizeof(arr[0])
但同样的,以上的写法虽然让sizeof操作符有了计算元素长度的能力,但也仅仅只作用于数组类型。
1、数组名有两种情况下代表整个数组元素:sizeof(数组名)、&数组名。只要sizeof取得整个数组元素后,再除以数组的其中一个元素,就可以计算出数组内的元素数量。
2、如果sizeof用于计算字符串长度时,则会发生麻烦,而这个麻烦的引发者也正是'\0'.
#include<stdio.h>
int main()
{
int count = 0;
char vate[] = "You can do it!";
count = sizeof(vate)/sizeof(vate[0]);
printf("vate的长度是:%d\n", count);
return 0;
}
?这里输出的就是15
因为sizeof计算的是元素类型的大小,它不像strlen函数,只计数'\0'之前的数位。sizeof在拿到字符串名后,就开始计算全部元素的大小,它才不做选择,它全要!
最后除以char类型的大小(1)后,就有了:15这个结果~?
一定不要忘了:最后专业的事交给专业的人,字符串用strlen函数求长度,数组类型用sizeof操作符求长度!
总结
如果你看到这里非常感谢,你的三连是对我的鼓励。有啥不对的请斧正,感谢大家的留言。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!