这段代码可以在VC 6.0的控制台下面跑起来。
#include <iostream.h>
#include<stdio.h>
#include<string.h>
void main()
{
//声明
cout<<"声明后:"<<endl;
char buf[100];
cout<<buf<<endl;
cout<<sizeof(buf)<<endl;
cout<<strlen(buf)<<endl<<endl;
//置0
cout<<"置0后:"<<endl;
memset(buf,0,100);
cout<<buf<<endl;
cout<<sizeof(buf)<<endl;
cout<<strlen(buf)<<endl<<endl;
//放入内容后
cout<<"放置内容后:"<<endl;
memcpy(buf,"ABC你好!",strlen("ABC你好!"));
cout<<buf<<endl;
cout<<sizeof(buf)<<endl;
cout<<strlen(buf)<<endl<<endl;
getchar();
}
从输出的结果可以看出来,sizeof的返回值是一个定的,也就是说不管这个buf里面存的是什么,sizeof始终返回这个buf的总的字节数。
strlen会根据buf里面的内容变化,决定strlen返回值的因素有两个:一个是缓冲区的指针,一个是缓冲区里面的内容,它是从缓冲区的头开始,如果没有遇到'/0'就一直计数,直到遇到'/0'返回,'/0'不计算在内。
在下面这些情况下会用到sizeof
1.比如一个buf,想把它全部置为0,那么memset的时候,就需要用sizeof指定buf的大小。
在下面这些情况下会用到strlen
1.比如在写磁盘fwrite的时候,或者socket send的时候,缓冲区可能很大,但是我们真正要操作的数据可能并没有填满缓冲区,这时候就可以用strlen得到要操作的数据的长度。
2.在memcpy的时候,把源数据拷贝到目标buf,大多数情况下,只是将源数据中的有效数据,也就是buf里面'/0'以前的内容拷贝到目标buf,这时候可以用strlen得到源数据的长度。