职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 836|回复: 4

c语言问题

[复制链接]
dgzxg 发表于 2009-8-18 10:40 | 显示全部楼层 |阅读模式
#include<stdio.h>
#include<string.h>
void main()
{
char ch1[]=\"Today is\";
char ch2[]=\"Monday\";
puts(ch1);
strcat(ch1,ch2);
puts(ch1);
puts(ch2);
}
这个程序运行的结果是:
Today is
Today is Monday
nday
用了strcat后怎么ch2的内容变了?
诗诺 发表于 2009-8-18 10:40 | 显示全部楼层

c语言问题

char ch1[]="Today is";改为 char ch1[30]="Today is";
因为你这样定义char ch1[]="Today is";ch1共有9个字节的内存地址
你在把ch2添加到ch1后面必然越界啊
容总 发表于 2009-8-18 10:41 | 显示全部楼层

c语言问题

首先
这个现象发生是由于ch1和ch2分配的空间相邻导致
而且可以推算出他们是直接相邻的

具体原因是这样的
首先需要明白两个特点:
strcat(ch1,ch2);//strcat的作用是将ch2覆盖到ch1的结尾处(覆盖ch1结尾处的&#39;\0&#39;)并添加&#39;\0&#39;作为新的串尾符
puts(ch2); //puts的作用是输出字符串
但是puts输出字符串时当遇到&#39;\0’时
便认为字符串结束
并结束输出

所以
ch1和ch2分配的空间如下:
Today is\0Monday\0
ch1-------ch2-----

在执行strcat(ch1,ch2)后
将ch2覆盖到ch1的结尾处(覆盖ch1结尾处的&#39;\0&#39;)并添加&#39;\0&#39;作为新的串尾符
此时存储状况如下:
Today isMonday\0\0(最后那个\0是ch2原来的
这个并没有被冲掉)
ch1-------ch2-----

所以
puts(ch1);//输出Today isMonday
直到遇到\0
puts(ch2);//原先ch2指向的位置变成了&#39;n&#39;,所以输出nday
直到遇到\0
成哥 发表于 2009-8-18 10:41 | 显示全部楼层

c语言问题

说明你的编译器是将声明的相邻的变量按顺序放在了一起,所以strcat的操作覆盖了ch2的空间.你可以用printf("%d %d",ch1,ch2);看下它们两者的地址,应该是相邻的.
青蛙 发表于 2009-8-18 10:41 | 显示全部楼层

c语言问题

ch2的内容不变化啊!!
楼主我运行过了
OK的
不知道你怎么就成了nday(你重新建个工作
重写一下,估计又遇到隐性错误了
而且新的ch1应该是
Today isMonday
中间没有多出一个空格出来的


不知道是不是你的手误
空格也是一个字符
你相当于多出一个字符了
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-16 16:36 , Processed in 0.144099 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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