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个字节。

posted @ 2012-02-09 22:43  Bains Lee  阅读(837)  评论(0编辑  收藏  举报