c/c++中sizeof()、strlen()、length()、size()详解和区别

一、求数组和字符串的长度:sizeof()、strlen()

1、sizeof():返回所占总空间的字节数
sizeof(…)是运算符,其值在编译时就计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。

2、strlen():返回字符数组或字符串所占的字节数
strlen(…)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’。返回的长度大小不包括’\0’。

代码演示:

#include<iostream>
using namespace std;

int main(){
	char* s1 = "0123456789";
	char s2[] = "0123456789";
	char s3[10] = "0123456";
	char s4[] = { 'a', 'c', 'c', 'b', 'g' };
	char s5[] = { 'a', 'c', 'c', 'b', 'g', 'g', '\0' };

	cout << "sizeof(s1) = " << sizeof(s1) << endl;  //s1是指向字符串常量的字符指针,sizeof 获得的是指针所占的空间,则为4
	cout << "sizeof(s2) = " << sizeof(s2) << endl; //s2是数组,计算到'\0'位置,因此是11
	cout << "sizeof(s3) = " << sizeof(s3) << endl; //s3表示分配内存的大小,100*1
	cout << "sizeof(s4) = " << sizeof(s4) << endl; //s4表示字符数组中字符所占的内存的大小,为5
	cout << "sizeof(s5) = " << sizeof(s5) << endl; //同理 为7
	cout << " ==============================" << endl;
	cout << "strlen(s1) = " << strlen(s1) << endl;  //s1是指向字符串常量的字符指针,strlen获得字符串的长度为10
	cout << "strlen(s2) = " << strlen(s2) << endl; // s2是数组,strlen获得字符串的长度为10
	cout << "strlen(s3) = " << strlen(s3) << endl; // s3字符数组的真实长度 7
	cout << "strlen(s4) = " << strlen(s4) << endl; //s4在计算长度时候,没有遇到‘\0’,因此为随机值 
	cout << "strlen(s5) = " << strlen(s5) << endl; //该字符串的第一个地址开始遍历,直到遇到结束符'\0'。返回的长度大小不包括'\0' 故为6 
	return 0;
}

在这里插入图片描述

结论:

(1)strlen(char*)函数求的是字符串和单个字符组成数组的实际长度,它求得方法是从开始到遇到第一个’\0’,字符串结尾默认是‘\0’,而单个字符组成的数组,结尾没有‘\0’,则长度为随机值,数组中有’\0’,则直到遇到’\0’停止,长度不包括‘\0’。

(2)sizeof()获得保证能容纳实现所建立的最大对象的字节大小,参数可以是数组、指针、类型、对象、函数等。

**

二、sizeof()、strlen()两者区别

**
(1)sizeof()是操作符,不是函数。该类型保证能容纳实现所建立的最大对象的字节大小,单位为字节,它在头文件中typedef为unsigned int类型。 而strlen()是函数。

(2)sizeof()可以用类型做参数,strlen(char*)只能用char*做参数,且必须以’’\0’'结尾的。 sizeof还可以用函数做参数,比如:

short f(); 
printf("%d\n", sizeof(f())); //输出的结果是sizeof(short),即2。

(3)sizeof()其值在编译时就计算好了。strlen()要在运行时才能计算,用来计算字符串的长度,不是类型占内存的大小。

(4)sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。 例如:

sizeof a; //sizeof(a);
sizeof (int);

(5)c/c++ strlen(str)和str.length()和str.size()都可以求字符串长度。其中str.length()和str.size()是用于求string类对象的成员函数strlen(str)是用于求字符数组的长度,其参数是char*。

**

三、c++中的size()和length()

**
例如:
string a=“0123456789”;

cout <<"a.length()="<<a.length()<<endl;//结果为10
cout <<"a.size()="<<a.size()<<endl;//结果为10

为了兼容使这两个函数一样, length()是因为沿用C语言的习惯而保留下来的,string类最初只有length(),引入STL之后,为了兼容又加入了size(),它是作为STL容器的属性存在的,便于符合STL的接口规则,以便用于STL的算法。 string类的size()/length()方法返回的是字节数,不管是否有汉字。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值