头文件 #include <cstring>
1、strlen() 库函数
原型:size_t strlen(const char *s),其中 size_t 就是 unsigned int。(在32位系统中size_t是4字节的,在64位系统中,size_t是8字节的,这样利用该类型可以增加程序移植性。)
功能:计算字符串s的有效长度,不包含结束字符‘/0’。
返回值:返回字符串s的字符数。
实现:
#include <assert.h> #include <stdio.h> int strlen(const char* str) { assert(str != NULL); int len = 0; while((*str++) != '/0') ++len; return len; }对于字符数组,例如char str[100]= "http://see.xidian.edu.cn/cpp/u/biaozhunku/"; 定义了一个大小为100的字符数组,但是仅有开始的11个字符被初始化了,剩下的都是0,所以strlen(str)= 11; 而sizeof(str) = 100;
如果字符的个数等于字符数组的大小,那么strlen()的返回值就无法确定了,例如char str[6] = "abcxyz";那么strlen(str)的返回值将是不确定的。因为str的结尾不是0,strlen()会继续向后检索,直到遇到'/0',而这些区域的内容是不确定的。
2、sizeof 运算符:
strlen() 函数计算的是字符串的实际长度,遇到第一个'/0'结束。如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'/0'停止。
而sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数。
sizeof 数组名 = 数组所占总字节数;
sizeof 数组元素 = 元素所占字节数;
数组长度 = sizeof 数组名/sizeof 数组元素;
例如:
int GetSize(int data[]){ return sizeof( data );}int _tmian(int argc, _TCHAR* argv[]){ int data1[] = {1,2,3,4,5}; int size1 = sizeof (data1); int * data2 = data1; int size2 = sizeof (data2); int size3 = Getsize (data1); PRintf ("%d, %d, %d", size1, size2, size3); return 0;}答案输出是“20, 4, 4”。
分析:data1是一个数组,sizeof(data1)是求数组的大小。这个数组有5个整数,每个整数占4个字节,因此总共是20个字节。
data2是一个指向数组data1的指针,在32位系统上,对任意指针求sizeof,得到的结果都是4。
在C/C++中,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针,所以尽管GetSize的参数data被声明为数组,但它会退化为指针,sizeof的结果仍然为4。
总结:strlen和sizeof的区别
• sizeof是运算符,strlen是库函数。
• sizeof可以用类型、变量做参数,而strlen只能用 char* 变量做参数,且必须以/0结尾。
• sizeof是在编译的时候计算类型或变量所占内存的大小,而strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度。
数组做sizeof的参数不退化,传递给strlen就退化为指针了。
对于字符数组,例如char str[100] = "http://see.xidian.edu.cn/cpp/u/biaozhunku/"; 定义了一个大小为100的字符数组,但是仅有开始的11个字符被初始化了,剩下的都是0,所以strlen(str) = 11; 而sizeof(str) = 100;
如果字符的个数等于字符数组的大小,那么strlen()的返回值就无法确定了,例如char str[6] = "abcxyz";那么strlen(str)的返回值将是不确定的。因为str的结尾不是0,strlen()会继续向后检索,直到遇到'/0',而这些区域的内容是不确定的。
2、sizeof 运算符:
strlen() 函数计算的是字符串的实际长度,遇到第一个'/0'结束。如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'/0'停止。
而sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数。
sizeof 数组名 = 数组所占总字节数;
sizeof 数组元素 = 元素所占字节数;
数组长度 = sizeof 数组名/sizeof 数组元素;
例如:
int GetSize(int data[]){ return sizeof( data );}int _tmian(int argc, _TCHAR* argv[]){ int data1[] = {1,2,3,4,5}; int size1 = sizeof (data1); int * data2 = data1; int size2 = sizeof (data2); int size3 = Getsize (data1); printf ("%d, %d, %d", size1, size2, size3); return 0;}答案输出是“20, 4, 4”。分析:data1是一个数组,sizeof(data1)是求数组的大小。这个数组有5个整数,每个整数占4个字节,因此总共是20个字节。
data2是一个指向数组data1的指针,在32位系统上,对任意指针求sizeof,得到的结果都是4。
在C/C++中,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针,所以尽管GetSize的参数data被声明为数组,但它会退化为指针,sizeof的结果仍然为4。
总结:strlen和sizeof的区别
sizeof是运算符,strlen是库函数。
sizeof可以用类型、变量做参数,而strlen只能用 char* 变量做参数,且必须以
/0
结尾。sizeof是在编译的时候计算类型或变量所占内存的大小,而strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度。
数组做sizeof的参数不退化,传递给strlen就退化为指针了。
新闻热点
疑难解答