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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Silent_memory 中级黑马   /  2014-3-15 00:27  /  1817 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Silent_memory 于 2014-3-25 22:58 编辑

    char args2[] = {'j','A','c'};
    printf("%li\n", strlen(args2));
   
    char args3[] = "jAc";
     printf("%li\n", strlen(args3));

帮我看下 上面两个输出的结果是不一样的一个是 4 一个 3  我不是很理解为什么?明白的给我解释下?谢了。
还有就是 这个 arg2 和arg3 那个可以看做是字符串?

4 个回复

倒序浏览
char args2[] = {'j','A','c'};//这个初始化后面你没有加'\0'
    printf("%li\n", strlen(args2));//因为你用的strlen求的长度,所以这个你求出的值不是固定的!他会一直找到一个'\0'才会结束!假如你用sizeof那么肯定出来是3!你去看看关于strlen和sizeof的区别吧·论坛里有人问过!
   
    char args3[] = "jAc";//这个初始化后面自动加了一个'\0'
     printf("%li\n", strlen(args3));
回复 使用道具 举报
本帖最后由 lixiangzhou 于 2014-3-15 09:14 编辑

我试了下你的程序,输出结果:
3
3
并非4,3
内存地址是由高开始分配的,先给arg2分配三个字节,再给arg3分配4个字节,具体如下:

由于strlen在遇到\0时会终止计算字符的数目,所以结果是3,3

回复 使用道具 举报
char args2[]={'j','A','c'};
这个初始化的时候你没有加'\0';所以printf("%li\n",strlen(args2));的长度不一致,我在没有添加'\0'的时候打印出来的是9,不添加'\0'的话,打印的结果不一致。
char args3[] = "jAc";
printf("%li\n", strlen(args3));此句是没有问题的,打印的结果为3,。
另外你可以直接看看sizeof()和strlen()这两个函数的区别与联系
回复 使用道具 举报
本帖最后由 keycola 于 2014-3-15 20:54 编辑

没有加'\0' 的,不能说是字符串

分析: char args2[] = {'j','A','c'};
          这条语句,你用的是单个存放,相当于
          args2[0] = 'j'
          args2[1] = 'A'
          args2[2] = 'c'
          后面是没有数据的,也就是只分配给 args2  3个char 空间,也就是空间的连续上度是 3
         这些数据是放在内存中的,由于你用的strlen()这个函数,是要以'\0' 这个字符为结尾
        才会是正确计算字符的长度,否则在每个电脑上运行的结果会是不同的,有的电脑会出现
        内存读写错误


         而:
               char args3[] = "jAc";
                由于是用的 "" 这样的表示,这编译会自动认为这是字符串,会自动开辟4个char空间
                第4个char 空间是存放'\0' 的,strlen()这个函数不会放这个'\0' 字符计算在内,所以是
               长度是3
   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马