黑马程序员技术交流社区

标题: 关于字符串和char类型数组 [打印本页]

作者: Silent_memory    时间: 2014-3-15 00:27
标题: 关于字符串和char类型数组
本帖最后由 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 那个可以看做是字符串?
作者: 脸皮猴    时间: 2014-3-15 08:59
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:10
本帖最后由 lixiangzhou 于 2014-3-15 09:14 编辑

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

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


作者: apple_victor    时间: 2014-3-15 15:28
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:51
本帖最后由 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
   





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