为啥程序:char x[4]={'a','b','c','d'}; char y[4]="efg";printf("%s",x);输出的结果却是abcdefg呢?

如题所述

C语言中的字符串有一个约定,即字符串的末尾用0来标识,所有处理字符串的函数都遵从这个约定,你的x数组,只有4个元素,而没有末尾的0,所以不会输出4个后自动停止,函数内部是不知道你传过去的参数是数组的,也不知道你要输出的字符的多少,只看末尾的0。为什么会输出efg是因为两点:一是xy的内存是连在一起的,所以d后面跟的是e,printf没看到0却看到了e,所以就输出e以及之后的几个字符,二是因为y是用双引号的方式初始化的,会自动在末尾加个0,所以efg后面是0,所以输出完g之后,看到了0,认为字符串结束。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-22
我只能说这是一个巧合,你的输出就是有问题的,不能用%s来输出x,因为%s是输出字符串,只有当有‘\0’的时候才结束。而x[4]却没有‘\0’,你的代码在编译的时候刚好变量x和y的地址是连续的,所以一直输出,直到出现‘\0’也就是y[3]才停止输出!
第2个回答  2013-03-22
printf 中%s输出 会从x[0]开始读字符 一直读到'\0'结尾
这里 你给x[4]赋值 a b c d
紧接着给 y赋值 内存地址可能临近 就会 接着读到 e f g 恰巧读到后面的'\0'
就会输出 abcdefg
但是 这不是绝对的 因为内存中 在x和y之间 也可能会有巧合 另一进程 占用里面的内存
第3个回答  2013-03-22
溢出了 x字符串没有结束符 \0

申请变量 存放顺序 后申请的放后面

输出顺序也一样

efg这种赋值方法后面有自动添加结束符

x y
a b c d e f g \0

因此输出x 就直接 一直输出到有结束符的这里的

...union X{ int x; char y[4]; }; 跪求答案啊,大神们,着急啊_百度知 ...
小端:低字节在低地址,高字节在高地址 y[3]=11

(C语言)如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(fo...
inta;intfoot,inch;scanf("%d",&a);foot=(int)(0.01*a\/0.3048);inch=(int)(12*(0.01*a\/0.3048-(double)foot));printf("%d%d",foot,inch);return0;}

C语言char x[]="12345"; char y[]={'1', '2', '3', '4', '5' };
x 是数组 x的内容同时也是串(系统自动添加了0结束符)y是数组 但y的内容不是串 即然不是串也就不存在串长的说法 说法正确的只有B,不过那考试题如果正的是让选不正确的,而标准答案又是B那只能说明这个考试太过儿戏了,不值得去考它

...main() { char a='本金',b='年数',c='年利率',d='应得利息'e='实...
C)t1=t2=t3=3;D)t1=1,t2=2;6.在PC 16位机下,下列程序执行后的输出结果是( )。main( )A)-32767B)FFFEC)-1D)-327687.以下程序的输出结果是( )。main(){ int x=’a’,y=’b’;printf(“x=%%%c,y=%%%c\\n”,x,y);}A)x=%a,y=%bB)x=a,y=bC)x=%%%c,y=%%%cD)x=%%c,y=...

用C程序设计学生分析系统
printf("请选择你要统计哪科的成绩 1.A\\t2.B\\t3.C\\t4.D\\t5.E\\n"); c1=getchar(); printf("\\t一共有个%d记录\\n",numstus); \/*总共记录数*\/ switch(c1) { case '1': for(i=0;i<numstus;i++) \/*循环输入判断*\/ { sum+=stud[i].subject[0]; if(stud[k].subject[0]>stud[i]....

你好,请编程大神回答以下问题:
第5题 第6题 (填空的地方见注释)第7题 第8题

...判断这四个数据能否组成四边形和正方形,能了输出1,不能输出0,不能...
偌a>0和(且)a=12,则错。 这语句的意思是a=12,则错。a>0是多余的。回到你的问题,意思就是判断这四个数据能否组成正方形。程序如下:include<stdio.h> int main(){ float a,b,c,d;int m1,m2,m3;printf("请输入abcd四个数据:\\n");scanf("%f%f%f",&a,&b,&c,&d);m1=(a-...

c语言求教
详情请查看视频回答

声明语句为"char s[4][5],*P1,**P2;int x,*y;
A.s就是&s[0][0],二维数组首地址,当然也是第一行数组的首址;可以当指针用,但哪一个都不是char **型二级指针,所以不匹配。B.y是int *型指针,*s是char型内容,不匹配。C.*p2是char *指针,s这里没说清,若*p2=s[0]、s[1]、s[2]、s[3]就都对(大小写只当是笔误)。D.只有...

若有定义char x[ ]=”12345”;char y[ ]={’1’,’2’,’3’,’4...
由C语言中对字符串的定义,在字符串最后以'\\0'作为结束符。因此x数组其实是{'1', '2', '3', '4', '5', '\\0'} 因此,选择B,即x数组的长度大于y的长度。2 凭方法 前提是该选择题是单项选择题。那么,可以看到,A和D其实表达了同一个意思,因此这两个选项都不可能是答案。然后,可以...

相似回答