sizeof()和strlen()区别
1. strlen 是函数,strlen(char*)函数求的是字符串的实际长度,直到遇到第一个'\0',然后就返回计数值,且不包括'\0',函数的返回值值在运行时确定。参数是指针或字符数组,当数组名作为参数传入时,实际上数组就退化成指针了。
2. sizeof是操作符,不是函数,返回的是变量声明后所占的内存数,不是实际长度。其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。当计算数组的size时,数组不会退化成指针。
strlen()是返回字符串的字节长度,
strlen()是返回字符串的字符长度。
也就是说第二个函数可能和第一个函数结果一样,如果字符串中字符单位都是单字节的话。
sizeof()不需要头文件,单目运算符
1 对于直接的调用sizeof,如果是数组首地址,sizeof会输出数组的元素个数。如果是一个指针的话,则输出在该系统中地址的字节宽度。
如下代码:则会以输出4, 30, 4。
int *a;
char b[30];
char *c;
printf("%d, %d, d\n", sizeof(a), sizeof(b),sizeof(c));
#include <string.h>
①strlen ()
# include<stdio.h>
# include<malloc.h>
# include<string.h>
int main(void)
{
char * c1 = "AbSjhhss";
int len1 = strlen(c1);
printf("len1 = %d\n", len1); //len1 = 8
char c2[] = {'a', '4', 'r', 't', 'd'};
int len2 = strlen(c2);
printf("len2 = %d\n", len2); //..error..len2 = 9
char c3[] = {'a', '4', 'r', 't', 'd', '\0'};
int len3 = strlen(c3);
printf("len3 = %d\n", len3); //len3 = 5
char c4[10] = "AbS";
int len4 = strlen(c4);
printf("len4 = %d\n", len4); //len4 = 3
char c5[4];
int len5 = strlen(c5);
printf("len5 = %d\n", len5); //len5 = 5
/*
c5[0] = '\0';
len5 = strlen(c5);
printf("len5 = %d\n", len5); //len5 = 0
*/
c5[4] = '\0';
len5 = strlen(c5);
printf("len5 = %d\n", len5); //len5 = 4
return 0;
}
总结:如果字符数组,
1.用字符串(双引号"")初始化,用strlen函数可以求出该字符串的长度
2.用字符数组的形式({'',''})初始化,必须在最后面添加一个元素'\0'才可以。
所以:strlen() 从字符数组首地址开始,一直找下去,直到遇到'\0'才停止
② memset它对较大的结构体或数组进行清零操作的一种最快方法。
问:为何要用memset置零?
答:1.如果不清空,可能会在测试当中出现野值。
2.其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
对于变量:
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]='/0';
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[10];
则
memset(TEST,0,sizeof(struct sample_struct)*10);