首页 > 学院 > 开发设计 > 正文

strlen()和sizeof

2019-11-06 06:53:39
字体:
来源:转载
供稿:网友

头文件 #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就退化为指针了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表