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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dream静 中级黑马   /  2014-11-6 13:55  /  1527 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

视频 里的一个题目
int main()
{
//编写一个函数void strling(char s[],char t[])
    //将字符串t链接到字符串s的尾部;
   
    char s1[20] = "michaet";
   
    char s2[] = "jackson";
   
    strling(s2, s1);
   
    printf("%s\n",s2);
    return 0;
}


void strling(char s[],char t[])
{
    int i = 0;
   
    while (s[i] != 0) {
        i++;
    }
   
    int j = 0;
    while (t[j] != 0) {
        s[i] = t[j];
        i++;
        j++;
    }

}
本来调用(s1,s2)
printf(s1)没问题

可是为什么调用(s2,s1)的时候
printf(s2)的时候会多一个s1的最后一位字符

但是为什么把s2的字符限定个数后比如s2[20]又正常了,这是为什么啊

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

6 个回复

倒序浏览
你的程序我没看  但看你描述的s2[20]就正常了   提醒一下: 数组,  s2[20]这样是定义了20长度的数组, 自动给你在末尾加上\0 你在输出 s2的时候会一直输出到\0就结束 但如果s2[]{'a','b','c'} 没有定义长度让它自己判断长度的话  他判断的方式是从元素首地址一直找到\0  这里的关键就是你s2[]这样定义是必须手动写\0的  如果你没写 他会一直往下一个内存度(已经越界了)  直到遇到\0 所以会度到别的值打印出来   数组多看一下吧

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

回复 使用道具 举报
doudou33420 发表于 2014-11-6 14:50
你的程序我没看  但看你描述的s2[20]就正常了   提醒一下: 数组,  s2[20]这样是定义了20长度的数组, 自动给 ...

感觉你掌握的很好啊!
不过这个题目你说的我知道,但是好像不是这个问题
因为我定义这个字符串数组是s2[]="dadas";这种的话在.c里面不是默认会再结尾+个'\0'吗,,
谢谢帮忙看下原因,
回复 使用道具 举报
本帖最后由 doudou33420 于 2014-11-6 22:03 编辑
dream静 发表于 2014-11-6 19:57
感觉你掌握的很好啊!
不过这个题目你说的我知道,但是好像不是这个问题
因为我定义这个字符串数组是s2[] ...


好个球  回头一复习基本忘完了
我看了下 还是\0的问题
s2长度 8字节(算上\0)   s1也是8字节   你在s2的第8位也就是\0的位置 插入 s1(不插入s1的\0) 7个字节
7 +7 14个字节  这并不是s2最终结果 他要读到\0才截止 你没插入\0 他只能往下读 读到\0 也就是原先s1的\0
所以他会把s1的所有值也读出来,
之所以会多了一个字符 是因为 你往s2插7个字节的字符时 只在 s2内存空间里插了一个字节(s1的第一个字符)
剩下的6个字符全插到s1里了(越界访问)  s1前6个字符被替换了 自己还剩2位没变 也就是最后一个字母t和\0  多出来的 就是这个两个元素了  \0是不显示的 所以.  不信你输出被替换后的s1就明白了  肯定是ichaett
至于你说的改成s2[20]就没问题原因就是数组长度问题,, 20个字符长度 s1+s2才几个 所以这时插入是不会越界的 因为往它还剩下很多空余的空间
回复 使用道具 举报
doudou33420 发表于 2014-11-6 21:55
好个球  回头一复习基本忘完了
我看了下 还是\0的问题
s2长度 8字节(算上\0)   s1也是8字节   你在s2的第 ...

太感谢了懂了!!!你原来学过这个么,,感觉比我厉害多了。。我零基础,学了20天了虽然视频看懂了以为会个七七八八了结果做起来才发现好多问题又重新复习一大遍头大
你也是考这一期把。。应该考上了把

还有个学习的问题
就是那个宏定义
加入我每次定义一个字符串或者数组,我不知道别人要输多少个,我看又的代码写得时int array[100];但是万一超过100呢!怎么定义。我看又的写得宏定义#define Number 100
Int array[Number];但是这两个不是一样的吗,不都是100,有何区别啊
怎么让定义的不受限。
回复 使用道具 举报
没呢 谁知道能不能考上 还没面试

你不能定义一个无线大的数组啊  你必须给他定义一个 数组长度
不管宏定义 还是变量什么的 你必须给数组一个值.  不然他没界限不是要把所有东西都放到他的数组里了.. (一个数组把剩下内存全吃了那你还怎么用内存)
C语言数组是这样的 必须预定义好长度;
OC有可变数组 不用定义长度  可以随时扩充元素
回复 使用道具 举报
都是高人啊!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马