关于strlen和sizeof的陷阱

来源:互联网 发布:22端口入侵教程 编辑:程序博客网 时间:2024/05/24 04:28

一,strlen是一个库函数,计算指定的字符串包含的字符个数,要求输入的串必须以'/0'结束,但计算的字符个数不包含'/0'本身。

例子:

1,    char szTest[100]; //注意这里还没进行初始化,里面的数据是随机的

         strlen(szTest); //此时输出的数据取决于数组szTest里面的'/0'在什么位置结束

 

 程序测试如下:

char szTest[100];

//先打印出随机的数据,看看'/0'在哪里结束
for(int i=0;i<100;i++){
 printf("szTest[%d]=%d,",i,szTest[i]);
}
fprintf(stdout,"strlen(pSz) = %d /n",strlen(szTest));

 

其中的一个输出是:

szTest[0]=-120,szTest[1]=-106,szTest[2]=-41,szTest[3]=-73,szTest[4]=-32,szTest[5]=49,szTest[6]=-21,szTest[7]=-73,szTest[8]=-40,szTest[9]=125,szTest[10]=-15,szTest[11]=-73,szTest[12]=-46,szTest[13]=-53,szTest[14]=-16,szTest[15]=-73,szTest[16]=-76,szTest[17]=-101,szTest[18]=4,szTest[19]=8,szTest[20]=-116,szTest[21]=120,szTest[22]=-15,szTest[23]=-73,szTest[24]=68,szTest[25]=-77,szTest[26]=-90,szTest[27]=-65,szTest[28]=122,szTest[29]=-52,szTest[30]=-16,szTest[31]=-73,szTest[32]=36,szTest[33]=51,szTest[34]=-21,szTest[35]=-73,szTest[36]=112,szTest[37]=53,szTest[38]=-21,szTest[39]=-73,szTest[40]=-36,szTest[41]=-101,szTest[42]=4,szTest[43]=8,szTest[44]=17,szTest[45]=0,szTest[46]=0,szTest[47]=0,szTest[48]=77,szTest[49]=-125,szTest[50]=4,szTest[51]=8,szTest[52]=-50,szTest[53]=112,szTest[54]=-18,szTest[55]=-73,szTest[56]=-76,szTest[57]=-101,szTest[58]=4,szTest[59]=8,szTest[60]=-116,szTest[61]=120,szTest[62]=-15,szTest[63]=-73,szTest[64]=68,szTest[65]=-77,szTest[66]=-90,szTest[67]=-65,szTest[68]=104,szTest[69]=-34,szTest[70]=-24,szTest[71]=-73,szTest[72]=-64,szTest[73]=112,szTest[74]=-18,szTest[75]=-73,szTest[76]=56,szTest[77]=121,szTest[78]=-15,szTest[79]=-73,szTest[80]=-40,szTest[81]=-78,szTest[82]=-90,szTest[83]=-65,szTest[84]=9,szTest[85]=-122,szTest[86]=4,szTest[87]=8,szTest[88]=-76,szTest[89]=-101,szTest[90]=4,szTest[91]=8,szTest[92]=-24,szTest[93]=-101,szTest[94]=4,szTest[95]=8,szTest[96]=-24,szTest[97]=-78,szTest[98]=-90,szTest[99]=-65

strlen(pSz) = 45  //此时输出的长度是45,我们可以看出szTest[45]的值恰好是0,从下标0-44共有45个字符。

 

//如果我们在定义数组的时候进行初始化或者调用memset进行置空,则此时strlen的值变为0

char szTest[100] ={0};

//或者memset(szTest,0x0,sizeof(szTest));

printf("strlen(szTest)=%d/",strlen(szTest)); //此时输出0

 

陷阱:

指针作为函数参数输出内容的情况

void get_content(char * pContent){

 //此时strlen(pContent)的行为是不确定的,可能是0或者是一个随机数,这种情况下只能通过参数再传递一个数组的长度,有人说,那用sizeof吧,真的可以吗?

  snprintf(pContent,strlen(pContent)+1,"%s","xxxxxx");

}

 

二,sizeof

 

 sizeof本质上讲不是一个库函数,因为可以sizeof xxtype,函数调用必须使用(), 也不是运算符,感觉更是一个宏,

是在编译期间计算对应数据类型或者数据对象的字节数目。

1,

char szTest[100];

sizeof(szTest);//输出100,代表一个100个bytes

 

2,

char szTest[100]={0};

sizeof(szTest);//还是输出100

 

memset(szTest,0x0,sizeof(szTest));

sizeof(szTest);//还是输出100

 

3,

 char *p = "tenfy";

sizeof(p);//32位机器上输出4,指针类型是一个四个btye表示的类型

 

4,

char szTest[100];

char *p = szTest;

sizeof(p);//32位机器上还是输出4,计算的仍然是指针类型的。

 

5,

void print_sizeof(const char *p)

{

  printf("%d",sizeof(p));

}

 

char szTest[100];

print_sizeof(szTest);

//注意这里输出的是4,而不是100,通过参数传递后的数组指针变成了一个普通的指针类型,计算的值变成了4了。

//理解是sizeof是在编译期间计算的,而通过函数调用的参数本身无法区分是数组还是指针,只能根据普通指针来计算,所以

//得出来的值是4,这里要小心使用指针进行内容输出的时候,函数体里面不能使用sizeof来计算对应的字节大小了。

 printf("%d",sizeof(szTest));//这里还是100

 

 

 

原创粉丝点击