《strlen()和sizeof()全网干货最细》

😁个人主页:小光死嗑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计算结构体大小,但是,这里面所涉及到的内容就有一小点点多了,小光会另外再给大家整理出一片文章进行详细的讲解!希望大家多多支持!

本篇文章有什么不满意的地方或者疑问,多多在评论区提出!🥰

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值