一、求数组和字符串的长度: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()方法返回的是字节数,不管是否有汉字。