A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马志华 中级黑马   /  2014-12-17 23:49  /  1337 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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,疑惑啊???

19 个回复

倒序浏览
打印地址发现两个数组内存并不是连续的 name2[3]又正好是0 就停了 为啥不是连续的布吉岛。。= =
回复 使用道具 举报
我用VC运行怎么是11呢,
回复 使用道具 举报
chasedream 发表于 2014-12-18 08:38
我用VC运行怎么是11呢,

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

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

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

我只知道VC里面汉字占2个字节,按照视频讲得VC应该是10啊
回复 使用道具 举报
zsling 中级黑马 2014-12-18 13:34:11
11#
我只知道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
这个结果我就非常郁闷不知道为什么了
回复 使用道具 举报
chasedream 发表于 2014-12-18 10:56
strlen 字符长度不是找到‘\0’为止吗?name2里面最后一位不是0也不是'\0',那不还得往下找吗? ...

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

strlen遇到'\0'就会结束计算,所以name[2]是3,如下为举例的char name2[]={'a','l','\0'};,输出是2,你可以自己试下。
回复 使用道具 举报
starl126 发表于 2014-12-18 20:36
strlen遇到'\0'就会结束计算,所以name[2]是3,如下为举例的char name2[]={'a','l','\0'};,输出是2, ...

你举得例子和上面说的name2一样吗
回复 使用道具 举报
为什么会是11呢?strlen函数返回的就是字符数,而不是字节数,所以不就是3个字符吗?木有问题
回复 使用道具 举报
#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为值。
回复 使用道具 举报
  strlen遇到‘/0’时才会停止计算,你像这样        char name2[]={'0','6','h','\0'};  在后面加上一个‘/0’就可以了,输出结果是3。
  如果你想写‘/0’,写成        char name2[]={"06h"};  也是可以的 ,输出结果也是3,因为“”里自带有‘\0’。
  但是如果你写成char name2[]={'0','6','h'}; 就不行了 ,因为它里面没有‘/0’这时输出结果是5,这个我也不知道是怎么计算出来的了。
  我是新手,这是我的理解,说的不对的请指正。谢谢
回复 使用道具 举报
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个字节,我就没法解释了。
    我是新手 ,这是我的理解,如果不对,希望不要吐槽。谢谢!
回复 使用道具 举报
被各位大神指教的有点乱了,还要看一边视频再研究一下了
回复 使用道具 举报
VC运行结果是11,Xcode还没试过,楼主打印出来的结果是3,莫非是两种编译器的运行机制不一样?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马