| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 769 人关注过本帖
标题:这个程序输出结果为什么有三个abcde
只看楼主 加入收藏
高茜
Rank: 1
等 级:新手上路
帖 子:46
专家分:1
注 册:2015-1-12
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:13 
这个程序输出结果为什么有三个abcde
#include <stdio.h>
int main ()
{
    char s[5]="abcde";
    char c[5]={'a','b','c','d','e'};
    printf ("%s",s);
    printf ("\n%s",c);
}
搜索更多相关主题的帖子: include 
2015-01-31 09:31
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:4 
怎么有三个呢?

我不是砖家,要努力成为砖家。
2015-01-31 09:33
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:4 
因为你的c数组没有'\0'这字符,所以会输出上面s的结束之后遇到一个'\0'。
而且你上面s数组定义也有问题,你必须要留一个放'\0'的位置,否则就覆盖了不属于你的内存空间,这太危险。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2015-01-31 09:57
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:4 
楼上说的很对,数组空间应该大一点

一片落叶掉进了回忆的流年。
2015-01-31 10:29
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
s[5]="abcde";
这句应该编译不成功的,字符串会把\0自动加进去的,s[5]的空间不够。

能编个毛线衣吗?
2015-01-31 11:05
高茜
Rank: 1
等 级:新手上路
帖 子:46
专家分:1
注 册:2015-1-12
收藏
得分:0 
回复 5楼 wmf2014
这个编译是可以通过的,而且也可以运行,运行结果是三个abcde,这是一张卷子上的题目,题目了定义就是这样的。那个没有留\0的位置只是在输出时候可能程序会不知道在哪里停止吧,编译应该是没问题的。
2015-01-31 16:05
高茜
Rank: 1
等 级:新手上路
帖 子:46
专家分:1
注 册:2015-1-12
收藏
得分:0 
回复 3楼 waterstar
还是不清楚为什么有三个输出。
2015-01-31 16:05
高茜
Rank: 1
等 级:新手上路
帖 子:46
专家分:1
注 册:2015-1-12
收藏
得分:0 
回复 2楼 砖家的谎言
它确实是有三个。(┬_┬)
2015-01-31 16:07
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
为什么显示3个,你要知道2个方面:
1,字符串在内存中怎么表示的:s[5]="abcde",实际上在内存中存储的是“'a''b''c''d''e'0”共6个字节,以数据0结尾,显示字符串时碰到0时就表示字符串结束了,c[5]={'a','b','c','d','e'}是对每个数组元素赋初值,没有以数据0结尾的字符串结束标志。
2,变量在内存中存放的顺序,c编译器会把后定义的变量先分配地址,即变量c的内存地址小于变量s的地址,通过显示&c[0]、&s[0]也会发现这一规律,所以你定义的两个字符数组在内存中存放的顺序是先c后s,其中只有s有结束字符,所以你定义的两个变量在内存中的数据如下:
abcde  abcde\0
c[5]   s[6]
有了上面的基础,就可以分析为什么显示3个了:
先printf("%s",s),显示abcde,碰到\0停止显示,第二次printf("%s",c),显示abcde,由于没有\0,所以继续往内存后面扫描,这时就碰到了存在c后面的s了,所以把变量s的字符又显示了一遍,直到碰到\0才停止显示。

如果你按下面的顺序定义变量,就看不到3个,而是看到在第二个abcde后面一大堆乱码
    char c[5]={'a','b','c','d','e'};
    char s[5]="abcde";

妹妹,那小狗狗好可爱哦,是真狗狗吧?

[ 本帖最后由 wmf2014 于 2015-1-31 19:11 编辑 ]

能编个毛线衣吗?
2015-01-31 19:01
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:4 
试了四个编译器
只有一个出现了三次abcde情况
看来编译器太智能了也不好

Only the Code Tells the Truth             K.I.S.S
2015-01-31 19:17
快速回复:这个程序输出结果为什么有三个abcde
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012588 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved