目录
序言
1 总览
2 用法
2.1 sizeof()
2.2 strlen()
3 length()和size()
序言
项目中经常用到这些用于计算大小的函数(或运算符),网上也有许多关于其间区别的文章介绍,在此按自己的思路整理一下,以便加深印象。
1 总览
strlen()、sizeof()、length()、size(),以上函数通常用于C/C++获取字符串的长度;但是他们的使用方法、主要针对的对象、是否包含'\0'结束符等等方面也有所不同,同时这些细节的差异决定了他们的使用场景。
| 本质 | 参数 | 是否包含'\0' | 作用 |
sizeof() | 运算符 | 数组、指针、类型、对象、函数等 | 是 | 获取所占总空间的字节数 |
strlen() | C函数 | 字符型指针(char*) | 否 | 获取字符串长度;从头遍历,遇'\0'截止; |
length() | 成员函数 (CString或String) | 仅针对字符串 | 否 | 用于获取字符串的长度; |
size() | 成员函数 | 数组、容器 | 否 | 用于获取数组或容器中的元素个数; |
2 用法
2.1 sizeof()
sizeof()是一个单目运算符,而不是函数;主要作用是返回参数对象所占用的内存字节数;其参数对象比较宽泛,因为关注点在内存占用上,也因此会包含'\0'结束符。
在编译时计算,因此不能用于计算动态分配空间的大小;当应用于固定长度数组的计算时,返回的是固定分配的内存字节数;
char carr[] = "1234";
const char* pch = "1234";
char carr1[] = {'1','2','3','4'};
char carr2[10] = { '1','2','3','4' };
//1 返回值为5,C风格字符串末尾自动添加了一个结束符'\0';
cout << "sizeof(carr) = " << sizeof(carr) << endl;
//2 返回值为4,计算的并不是内存字节占用,而是指针变量本身占用的字节数;
cout << "sizeof(pch) = " << sizeof(pch) << endl;
//3 返回值为4,计算的是数组中元素占用的内存字节数;
cout << "sizeof(carr1) = " << sizeof(carr1) << endl;
//4 返回值为10,计算的是数组固定分配的内存字节数;
cout << "sizeof(carr2) = " << sizeof(carr2) << endl;
PS: char carr[5] = "1234"; 这种初始化数组的方式,固定数组长度值一定要计算末尾的结束符'\0'。
通过以上代码段可以看出sizeof()计算时的几个注意点:
1 C风格字符串末尾自动添加结束符'\0',sizeof()的计算是包含结束符的;
2 数组名作为sizeof()的参数时不会退化为指针;
3 固定长度的数组无法用sizeof()来计算实际存储元素的个数;
2.2 strlen()
strlen()是一个函数,在运行时计算,参数必须是字符型指针(char*),数组作为参数时会退化为指针;从字符串第一个地址开始遍历,直到遇到第一个结束符'\0'为止,大小不包含结束符。
char carr[] = "1234";
const char* pch = "1234";
char carr1[] = {'1','2','3','4'};
char carr2[10] = { '1','2','3','4'};
char carr3[] = { '1','2','3','4','\0' };
//1 返回值为4,数组名退化为指针,不包含结束符;
cout << "strlen(pch) = " << strlen(pch) << endl;
//2 返回值为4,不包含结束符;
cout << "strlen(carr) = " << strlen(carr) << endl;
//3 返回值为8,返回值是没有意义且计算动作是危险的,数组中没有明确结束符,strlen会一直计算直至遇到第一个结束符为止;
cout << "strlen(carr1) = " << strlen(carr1) << endl;
//4 返回值为4,固定长度定义数组时,通常系统会将未使用的空间自动填充'\0';(PS:若单个元素赋值初始化的方式,系统不会自动填充)
cout << "strlen(carr2) = " << strlen(carr2) << endl;
//5 返回值为4,数组定义中显示填充了结束符'\0';
cout << "strlen(carr3) = " << strlen(carr3) << endl;
3 length()和size()
length()和size()都是成员函数,在运行时计算,length()只针对字符串,而size()可以应用于STL的容器中,size()计算的是元素的个数;在string类中,length()/size()方法返回的是字节数,不管是否包含汉字;
string str = "1234你好";
char arr[] = "1234你好";
string str2 = arr;
//1 返回值为8,返回字节数;
cout << "str.length() = " << str.length() << endl;
//2 返回值为8,返回字节数;
cout << "str.size() = " << str.size() << endl;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)