鱼C论坛

 找回密码
 立即注册
查看: 1478|回复: 10

[已解决](更新)C语言!

[复制链接]
发表于 2020-12-31 16:30:48 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
main()
{
        char a[3][2]={'a','b','c','d','e','f'};
        a[2][0]='\0';
        printf("%s",a[0]);
}

请问各位,为啥输出的结果为abcd呢?a[0]表示的应该是二维数组的第一行呀,应该输出ab呀?还有为啥改为%c编译器就啥也输不出来呢?
最佳答案
2020-12-31 17:00:34
1、为啥输出的结果为abcd呢?
你这数组定义方式有误,所以存在了越界情况。。。
按你的意思应该是char a[3][2]={{'a','b'},{'c','d'},{'e','f'}};
2、a[0]表示的应该是二维数组的第一行呀,应该输出ab呀?
还是和问题1一样,如果你定义对了,就没错了。
3、为啥改为%c编译器就啥也输不出来呢?
你也知道a[0]并不是单个字符,%c只能输出单个字符,因此你用%c 输出多个字符怎么不报错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-31 16:37:21 | 显示全部楼层
本帖最后由 一世轻尘 于 2020-12-31 16:50 编辑

a[0]是占用一个char大小对象的地址,a是一个占用两个char大小对象的地址,由于这个数和内含两个数的数组都开始于同一个地址,所以a和a【0】的值相同,a[0]指的是该数组首元素(a[0][0])的地址,%s,是输出字符串,碰到’\0'才会停止
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-31 16:50:02 | 显示全部楼层
一世轻尘 发表于 2020-12-31 16:37
a[0]指的是该数组首元素(a[0][0])的地址,%s,是输出字符串,碰到’\0'才会停止

为啥改为%c就不行了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-31 16:54:31 | 显示全部楼层
肚子饿了233 发表于 2020-12-31 16:50
为啥改为%c就不行了呢?

a[0]本身是一个内含两个char型的数组,用%c只能输出单个字符,至于为啥它一个也不输出那我就不清楚了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-31 17:00:34 | 显示全部楼层    本楼为最佳答案   
1、为啥输出的结果为abcd呢?
你这数组定义方式有误,所以存在了越界情况。。。
按你的意思应该是char a[3][2]={{'a','b'},{'c','d'},{'e','f'}};
2、a[0]表示的应该是二维数组的第一行呀,应该输出ab呀?
还是和问题1一样,如果你定义对了,就没错了。
3、为啥改为%c编译器就啥也输不出来呢?
你也知道a[0]并不是单个字符,%c只能输出单个字符,因此你用%c 输出多个字符怎么不报错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-31 17:06:37 | 显示全部楼层
笨鸟学飞 发表于 2020-12-31 17:00
1、为啥输出的结果为abcd呢?
你这数组定义方式有误,所以存在了越界情况。。。
按你的意思应该是char a[ ...

定义方式好像没错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-31 17:20:30 | 显示全部楼层

#include<stdio.h>
main()
{
        char a[3][2]={'a','b','c','d','e','f'};
        a[1][0]='\0';
        printf("%s",a[0]);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-31 17:38:42 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-31 17:40 编辑
        char a[3][2]={'a','b','c','d','e','f'};
        执行下面的语句后
        a[2][0]='\0';
        变成了
        char a[3][2]={'a','b','c','d','\0','f'};
        尽管 a[0] 应该只包括 2 个字符,'a' 和 'b',但是,在作为字符串显示的时候,printf() 函数会继续续显示 a[0] 的后续字符,直到遇到第一个 '\0' 为止,于是,字符串 a[0] 显示出来就是 "abcd" 了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-31 23:08:31 | 显示全部楼层
a[2[0]  是定位到 字符e 啊没毛病的  e改成了\0     %s遇到\0 就停止读取了   所以是abcd
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-31 23:41:26 | 显示全部楼层
a[0][0]=a ,  a[0][1]=b,    a[1][0]=c,    a[1][1]=d,   a[2][0]=e,    a[2][1]=f;  当a[2][0]='\0'时,字符串结束输出,所以结果为  abcd
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-2 22:56:17 | 显示全部楼层
输出a【0】,系统会认为你要输出的是字符串,所以改成%c就不行,而输出字符串不会在那行就停,只有遇到\0才会停,原本是应该在数组的末尾接受到的\0,由于a【2】【0】有定义了,所以提前停止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 06:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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