黑马程序员技术交流社区

标题: 结果输出有问题??求大神指教 [打印本页]

作者: 马志华    时间: 2014-12-17 23:49
标题: 结果输出有问题??求大神指教
  1. #include <string.h>

  2. #include <stdio.h>



  3. int main()
  4. {
  5.     char name[]="哈hahah";
  6.     char name2[]={'0','6','h'};
  7.    
  8.     int size=strlen(name2);
  9.    
  10.     printf("%d\n",size);

  11.     return 0;
  12. }
复制代码



char name2[]={'0','6','h'};没有\0,输出结果应该是11才对啊,但是打印出的结果是3,疑惑啊???

作者: 从今以后    时间: 2014-12-18 00:20
打印地址发现两个数组内存并不是连续的 name2[3]又正好是0 就停了 为啥不是连续的布吉岛。。= =
作者: chasedream    时间: 2014-12-18 08:38
我用VC运行怎么是11呢,
作者: chasedream    时间: 2014-12-18 08:39
chasedream 发表于 2014-12-18 08:38
我用VC运行怎么是11呢,

后面自己手动填0,就成3了:lol
作者: 马志华    时间: 2014-12-18 08:54
奥,明白了,我回去再试一下,把char name2[]={'0','6','h'};中的0改为其他字符再试一下,谢谢啊
作者: starl126    时间: 2014-12-18 09:39
答案肯定是3,大括号里面再加字符标志,就相当于告诉编译器我制定的字符数组的长度是3,用strlen计算出来的当然是3.你上面的name用strlen计算出来的是8个字节,中文占3个。其他各占一个。
作者: zsling    时间: 2014-12-18 10:16
我用VC运行出来的结果也是11,奇怪了,不太清楚哪里的问题
作者: chasedream    时间: 2014-12-18 10:52
马志华 发表于 2014-12-18 08:54
奥,明白了,我回去再试一下,把char name2[]={'0','6','h'};中的0改为其他字符再试一下,谢谢啊 ...

我觉得理论也应该是11,你真明白了?为什么呢
作者: chasedream    时间: 2014-12-18 10:56
starl126 发表于 2014-12-18 09:39
答案肯定是3,大括号里面再加字符标志,就相当于告诉编译器我制定的字符数组的长度是3,用strlen计算出来的 ...

strlen 字符长度不是找到‘\0’为止吗?name2里面最后一位不是0也不是'\0',那不还得往下找吗?
作者: chasedream    时间: 2014-12-18 10:57
zsling 发表于 2014-12-18 10:16
我用VC运行出来的结果也是11,奇怪了,不太清楚哪里的问题

我只知道VC里面汉字占2个字节,按照视频讲得VC应该是10啊
作者: zsling    时间: 2014-12-18 13:34
我只知道VC里面汉字占2个字节,按照视频讲得VC应该是10啊


我发现一个有趣的问题:

#include <stdio.h>

#include <string.h>

int main()
{
    char name[]="h";
    char name2[]={'0','6','h'};
    int size=strlen(name2);
    printf("%d\n",size);
    return 0;
}
输出结果:4
如果char name[]="\0h";
输出结果还是:4
如果char name2[]={'0','6','h','\0'};
输出结果:3
所以:是不是在连接两个数组的时候把\0也计算在内?
更奇怪的是
如果如果char name2[]={'0'};
char name[]="\0h";
输出结果:4
这个结果我就非常郁闷不知道为什么了

作者: 从今以后    时间: 2014-12-18 13:43
chasedream 发表于 2014-12-18 10:56
strlen 字符长度不是找到‘\0’为止吗?name2里面最后一位不是0也不是'\0',那不还得往下找吗? ...

name2里面最后一位的下一位碰巧正好是0也就是'\0',就成这样了,你可以打印下,如果俩数组内存连续,应该是11的
作者: starl126    时间: 2014-12-18 20:36
chasedream 发表于 2014-12-18 10:56
strlen 字符长度不是找到‘\0’为止吗?name2里面最后一位不是0也不是'\0',那不还得往下找吗? ...

strlen遇到'\0'就会结束计算,所以name[2]是3,如下为举例的char name2[]={'a','l','\0'};,输出是2,你可以自己试下。
作者: chasedream    时间: 2014-12-18 21:54
starl126 发表于 2014-12-18 20:36
strlen遇到'\0'就会结束计算,所以name[2]是3,如下为举例的char name2[]={'a','l','\0'};,输出是2, ...

你举得例子和上面说的name2一样吗
作者: 邹志鹏    时间: 2014-12-18 22:19
为什么会是11呢?strlen函数返回的就是字符数,而不是字节数,所以不就是3个字符吗?木有问题
作者: zx413331474    时间: 2014-12-19 17:01
#include <stdio.h>
int main()
{
char name[]={
  '1','4'
};
printf("%d\n",name[4]);
return 0;
}
你的文件中的name2[]是一个字符数组,字符数组是没有终止符的,而字符串是有终止符\0的,你内存开辟空间的时候,name和name2的地址值是不确定是否连续的。就想我上传的代码一样,定义一个字符数组,里面有两个元素,但是可以访问name[4],实际上就是指针的原理。而name2中没有\0,所以他会一直往下面读取,直到读到内存中的0或者\0为值。
作者: 小孩你过来    时间: 2014-12-19 17:59
  strlen遇到‘/0’时才会停止计算,你像这样        char name2[]={'0','6','h','\0'};  在后面加上一个‘/0’就可以了,输出结果是3。
  如果你想写‘/0’,写成        char name2[]={"06h"};  也是可以的 ,输出结果也是3,因为“”里自带有‘\0’。
  但是如果你写成char name2[]={'0','6','h'}; 就不行了 ,因为它里面没有‘/0’这时输出结果是5,这个我也不知道是怎么计算出来的了。
  我是新手,这是我的理解,说的不对的请指正。谢谢
作者: 小孩你过来    时间: 2014-12-19 18:21
zsling 发表于 2014-12-18 13:34
我发现一个有趣的问题:

#include

#include <stdio.h>

#include <string.h>

int main()
{
     char name[]="z";   //  7行
  char name2[]={'0','6','z'};  //  8行
  int size=strlen(name2);
     printf("%d\n",size);
return 0;
}
    输出的是5
如果在7行8行之间插入:char name1[]={'0','6','z'}; 
  输出就真的变成了9,
    说明你说的 是不是在连接两个数组的时候把\0也计算在内 可能是对的。
    但是我认为应该不是\0,因为strlen在遇到\0,时就会停止计算,我认为是在name1 name2中有一个不知道是什么的占据了一个字节,才会让结果偏大。
     比如第一次计算的结果是5,应该是char name2[]={'0','6','z'}中占据了4个字节,但是没有\0所以不会停下来,继续计算char name[]="z";占据 1个字节 ,“”中有隐含的\0停止计算。4+1当好等于5.
    等于9 的结果也能按这样的方法计算,结果也对的上。但是为什么char name2[]={'0','6','z'}占据4个字节,我就没法解释了。
    我是新手 ,这是我的理解,如果不对,希望不要吐槽。谢谢!
作者: 马志华    时间: 2014-12-26 09:06
被各位大神指教的有点乱了,还要看一边视频再研究一下了
作者: HONG321    时间: 2014-12-26 10:27
VC运行结果是11,Xcode还没试过,楼主打印出来的结果是3,莫非是两种编译器的运行机制不一样?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2