C语言问题 关于strlen

Int main()
{
char a[1000];
int i;
for(i=0;i<1000;i++)
{
a[i]=-1-i;
}
printf("%d"strlen(a));
retern 0;
}

printf那条里面a指的是a数组首元素的地址吗?
为什么答案是255.意思是有255位吗?
怎么得出来的

a是首元素地址没错。

但不是说有255位!

首先printf中你少了个逗号...

你可以尝试着把a中的字符打印出来检查一下。可以看到当i=255的时候,-1-255=-256,最低位的8个bit全部为0,在程序中被判定为'\0',也就是字符串的结束符,这会使得在用strlen的时候只统计到该位为止的长度。

除此之外,当i=511和i=767的时候,在a[511]、a[767]中也被赋值为了'\0'。

通过如下的语句可以检测出结束符的位置:

int main(i)
{
  char a[1000];
  int i;
  for(i=0;i<1000;i++)
  {
   a[i]=-1-i;
   if (a[i]=='\0')
   {
    printf("%d\n",i);
   }
  }
  printf("%d",strlen(a));
  system("pause");
 return 0;
}

 

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-25
对,对!a是首元素地址。255位也对,可是为什么呢?是这样的:a存放的数的范围是-128~127,-1是11111111;我们看,i从0变到1000要经过i=127,下一次就是i=128了。可是128已经超出a能存放的范围了,那么存入a[128]的是什么数呢?是-1-128=-129!-129超出了a能存数据的最小限-128,所以要“截断”存入,即只存入最低字节01111111,这实际上是127!同样,下一个i=129时,得a[129]=-1-129=-130=(截断后)01111110=126……依次类推,a[130]=125、a[131]=124、a[132]=123……a[255]=0。0就是‘\0',是字符串的结束符,所以用strlen(a)测得的长度为a[0]~a[254]的长度共255个元素!后面虽然i还在增长,还可以遇到a[i]=0的时候,但strlen(a)已测不到那里了,被第一个0打住了……
第2个回答  2013-08-25
i=0时 a[0]=-1
i=1 a[1]=-2
i=2 a[2]=-3

以此类推,
i=127 a[127]=-128
关键点:i=128 a[128]不等于-129,因为,带符号的char类型的表示范围为[-128,127],因此,a[128]=127 (补码的表示)
i=129 a[129]=126
i=130 a[130]=125

以此类推
i=255 a[255]=0 (字符串结束标志)
i=256 到999就不用管了 所以字符串长255
第3个回答  2013-08-25
printf那条里面a指的是a数组首元素的地址吗?

答:是的
为什么答案是255.意思是有255位吗?

答:是的
怎么得出来的?

for(i=0;i<1000;i++)
{
a[i]=-1-i;
}
-1 - 1=-2
-1 -2 = -3
以以类推
-1-255 = -256 这个整数占四个字节,最后一个字节是全0 , 赋值给char类型变量,只会取最后一个字节,因此,a[255]=0
0就是字符串的结束符,Strlen()函数就是从数组首地址到字符串结束符的字符个数,因此,返回255
第4个回答  2013-08-25
你好 首先你的输出有错误 少了一个 , 应该是printf("%d",strlen(a)); 然后 strlen 数组不是求首地址的 它求的是a这个字符串的长度。
相似回答