最近在网上看了一个程序:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char a[1000];
int i;
for(i = 0;i<1000;i++)
{
a[i] = -1-i;
}
printf("%d\n",strlen(a));
return 0;
}
得到最后的结果的是255
下面是我经过测试得到的一点点小结论,供大家共勉。
只有当a[0]的值在计算机中存储的补码的最后一位是1时,此时经过strlen(a)得到的结论才不是0.当遇到a[i]==0时,就相当于到了'\0'。所以会是上面的结果。
char的取值范围是-128到127.
我想上面的代码大家就应该明白了吧。
在第256个值时(也即是a[255]),a[255]==0;再加之strlen计算的结果不包含'\0',(sizeof是要计算'\0'的)。所以就是255咯。
由于发帖(http://www.dewen.org/q/6306/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%9C%E4%B8%BA0)提出这个问题后,有很多网友给出比较理论方面的回答。我也在此做点总结吧。
首先我们需要明白字符0是'0',而数值0就是0,以及需要明白'\0'在计算机中时怎么存储的。字符数字‘0’的ascii值是48,所以存储的是10形式。而数值0就是00,‘\0’也是存储的00.
其次我们需要明白:
strlen是求字符串的长度,不同于sizeof,strlen总是以'\0'作为字符串的结束标志。
然而字符串结束符'\0'存在内存中的值是0x00,当用strlen求字符串长度时,读到内存中的0x00就当做是字符串结束符'\0'。