1、我们先来看一下这两者的概念。strlen是一个函数,求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从arr首地址一直找下去,直到遇到’\0’停止。 而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
2、分别用strlen和sizeof计算数组arr【10】的长度,看运行的结果。
#include<iostream> using namespace std; int main() { char arr[10]; cout<<strlen(arr)<<endl; cout<<sizeof(arr)<<endl; return 0; }
输出的及结果是:
15
10
你会发现,用strlen获取的结果是不定的 ,而sizeof()返回的是变量声明后所占的内存数,不是实际长度。
2、这一次我们对数组arr[10]进行部分的初始化,再来看结果。
#include<iostream>
using namespace std;
int main()
{
char arr[10]={1,2,3};
cout<<strlen(arr)<<endl;
cout<<sizeof(arr)<<endl;
return 0;
}
输出的结果是:
3
10
输出的结果是:
3
10
这一次strlen获取到是字符串的实际长度3。
3、我们来看一下指针,注意的是后面对字符串的某个值进行初始化后,strlen的结果是有变化的。
#include<iostream>
using namespace std;
int main()
{
char *t;
t=(char *)malloc(sizeof(char)*10);
printf("no1 strlen(t)=%d ? sizeof(t)=%d ? \n\n\n",strlen(t),sizeof(t));
*(t+3)='\0';
printf("no2 strlen(t)=%d ? sizeof(t)=%d ? \n",strlen(t),sizeof(t));
return 0;
}
输出的结果是:
no1 strlen(t)=22 ? sizeof(t)=4 ?
no2 strlen(t)=3 ? sizeof(t)=4 ?
你会发现用sizeof是获取不到指针字符串的长度,返回的是4,t是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是
长整型的,所以是4 。注意的是后面对字符串的某个值进行初始化后,strlen的结果是有变化的。
4、 最后来看一下char arr[10]=“12345678”;char *t=“12345678”;这样的定义结果会如何呢。
#include<iostream>
using namespace std;
int main()
{
char arr[10]="12345678";
char *t="12345678";
printf("no2 strlen(t)=%d ? sizeof(t)=%d ? \n",strlen(t),sizeof(t));
printf(" strlen(arr)=%d ? sizeof(arr)=%d\n",strlen(arr),sizeof(arr));
return 0;
}
输出的结果是:
no2 strlen(t)=8 ? sizeof(t)=4 ?
strlen(arr)=8 ? sizeof(arr)=10
Press any key to continue
哈哈哈,自己体会吧!!!!