鱼C论坛

 找回密码
 立即注册
查看: 857|回复: 8

[已解决]对鱼C第18课4分钟的代码有疑问

[复制链接]
发表于 2020-10-17 15:16:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
int main()
{
    int n, i;


    printf("请输入字符的个数:");
    scanf("%d",&n);

    char a[n];          \\小甲鱼写的是    “char a[n+1]”
    printf("请开始输入字符:");
    getchar();
    for(i=0; i<n;i++)
    {
        scanf("%c",&a[i]);
    }
    a[n]= '\0';
    printf("你输入的字符是:%s\n",a);
    return 0;
}

我在测试后发现两个代码都一样,那这个n+1还有必要写吗。
最佳答案
2020-10-17 18:31:07
n+1估计是小甲鱼想方便自己调用a[n],他懒得写a[n-1]。如果这个最后元素用得多了,直接a[n]就能节省一定的时间。
字符串是以'\0‘结尾的。所以不管你数组咋样,你要是以%s访问,那么计算机会从头开始,一个个问,直到遇到'\0'。'\0'在内存中实际就是0。它是一个字节,所以是八个0。你后面的?是因为你输入了17,计算机没有停止,会继续下去,那个计算机就显示为?,然后,后面的它里面本来就是0,所以?后面没东西了,就出现那个了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-17 15:20:59 | 显示全部楼层
定义的a[n+1]里一共有n+1个元素
也就是下面for循环里的a[0]到a[n],
你改成char a[n]后,在访问到a[n]时数组会越界报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 15:37:35 | 显示全部楼层
char a[n]代表这个数组有N个数, a[n]=‘\0’代表读取第n个数时结束。理论上a[n]里面有n+1个数,但是在将n赋值后,例如char a[4]      和    a[4]。
在输入第4个数后,第5个数及之后的数均不输出,只输出前面4个输入的数,和甲鱼的代码的输出结果是一样的,那么n+1是否为必要呢。
对了,我在把 (   a[n]= '\0';    )删去后,输入17,然后输入 (    i love fishc,com!   ),输出结果是(     i love fishc,com!?     ),这个问号是怎么来的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 17:09:24 | 显示全部楼层
昨非 发表于 2020-10-17 15:20
定义的a[n+1]里一共有n+1个元素
也就是下面for循环里的a[0]到a[n],
你改成char a[n]后,在访问到a[n]时数 ...

我用的CODE,没有报错,结果和char a[n] 是一样的。
打个比方,char a[n];其中n=5.就表示这个数组里有5位数对吧;  a[n]就是a[5],意思是读到char a[5]中的第5位数;这5位数分别是:1,2,3,4,5;    (a[5]='\0';)就表示读到5时就停止,不继续往下读。是这样的吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 17:19:32 | 显示全部楼层
这里根本没用到n+1。循环在n-1就停了。所以没啥区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 17:22:55 | 显示全部楼层
2269099035 发表于 2020-10-17 17:19
这里根本没用到n+1。循环在n-1就停了。所以没啥区别

那有没有需要用到n+1的例子呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 17:41:15 | 显示全部楼层
光C 发表于 2020-10-17 17:22
那有没有需要用到n+1的例子呢

没遇到过,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 18:31:07 | 显示全部楼层    本楼为最佳答案   
n+1估计是小甲鱼想方便自己调用a[n],他懒得写a[n-1]。如果这个最后元素用得多了,直接a[n]就能节省一定的时间。
字符串是以'\0‘结尾的。所以不管你数组咋样,你要是以%s访问,那么计算机会从头开始,一个个问,直到遇到'\0'。'\0'在内存中实际就是0。它是一个字节,所以是八个0。你后面的?是因为你输入了17,计算机没有停止,会继续下去,那个计算机就显示为?,然后,后面的它里面本来就是0,所以?后面没东西了,就出现那个了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 20:38:59 | 显示全部楼层
405794672 发表于 2020-10-17 18:31
n+1估计是小甲鱼想方便自己调用a[n],他懒得写a[n-1]。如果这个最后元素用得多了,直接a[n]就能节省一定的 ...

谢谢,明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-5 22:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表