c++中的strlen 函数和sizeof运算符的比较
初学c++的时候,对strlen函数和sizeof运算符的运用感到迷惑,查询MSDN后,得到的结果如下:
strlen, wcslen, _mbslen, _mbstrlen
Get the length of a string.
size_t strlen( const char *string );
size_t wcslen( const wchar_t *string );
size_t _mbslen( const unsigned char *string );
size_t _mbstrlen( const char *string );
可以看出,这几个函数的作用都是获取一个size_t类型的值,而size_t类型在VC++中定义为 :typedef unsigned int size_t,也就是说size_t就是一个无符号整型数,这个返回值代表字符串的长度。在利用strlen函数计算字符串的长度时,需要加入头文件 #include<string.h>。
再看看sizeof运算符的定义:
sizeof运算符给出一个类型或变量所需的存储空间,以字节为单位。这个关键字返回值为size_t,也就是一个无符号整型,通常我们可以用一个整型int来存放它的返回值,如:
int length = sizeof(int);
char str[50] = "A string";
int amount = sizeof(str);
下面来看MSDN上给出的两段代码以及其运行结果:
一:
size_t i = sizeof( int );
struct align_depends {
char c;
int i;
};
size_t size = sizeof(align_depends);
int array[] = { 1, 2, 3, 4, 5 }; // sizeof( array ) is 20
// sizeof( array[0] ) is 4
size_t sizearr = // Count of items in array
sizeof( array ) / sizeof( array[0] );
这段代码给出了使用sizeof运算符计算一个整型变量和一个结构体的存储空间大小的例子,sizeof运算符是在编译的时候就计算出了其值,因此也可以这样写:
cout<<"The Space of int is: "<<sizeof(int)<<endl;
int array[ sizeof(int) ];
cout<<"The Space of array is: "<<sizeof(array)<<endl;
第一个输出为4,第二个输出为16。我们知道,定义一个静态数组的时候需要事先知道其数组的大小,而这里的数组定义可以编译通过,这就验证了sizeof运算符在编译的时候就计算出了结果,而不是等到执行时才去运算。
另一方面,我们看到了,定义array这个数组,并没有对数组中的值初始化,只是分配了一些大小相同的存储空间,而sizeof(array)的执行结果为16,也就是数组的存储空间大小。由此可以得出:sizeof运算符用来得到一个变量或类型的存储空间的大小。
二:
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
void main( void )
{
char buffer[61] = "How long am I?";
int len;
len = strlen( buffer );
printf( "'%s' is %d characters long\n", buffer, len );
}
这段代码的执行结果是:len = 13, 注意这里的buffer数组的内存空间大小是61,而strlen函数的执行结果是13,这就可以得出它与sizeof运算符的区别:sizeof运算符计算类型或变量所需的存储空间大小,而strlen函数是计算出一个字符串中有多少个字符,通常计算的标准是数组中的结束符'\0'之前有多少个字符。
比如:当执行语句 char buffer[61] = "How long am I?"时,等价于 char buffer[61] = {'H','o','w',' ','l','o','n','g',' ','a','m',' ','I','?','\0'}; strlen函数执行时,就会去数buffer数组中'\0'之前的字符,没数一个,计数器就加一,最后会得到13的结果。
再看一个例子:
int main()
{
char *s = "This is a string";
int length = strlen(s);
int space = sizeof(s);
cout<<"The length is: "<<length<<endl;
cout<<"The space is: "<<space<<endl;
}
这段代码的执行结果为:length = 16, space = 4;这个结果可以反映出strlrn函数接受一个const char* 类型的指针,而这个指针指向一个字符型数组,strlen(s)函数计算的是指针s指向的字符型数组中的字符的个数,而sizeof(s)计算的是存贮指针的存储空间的大小,为4个字节。