字符串处理函数strcpy()

main(){charst1[7],st2[]="Language";strcpy(st1,st2);puts(st1);printf("\n");}st1[7]长度不够... main()
{
char st1[7],st2[]="Language";
strcpy(st1,st2);
puts(st1);printf("\n");
}
st1[7]长度不够,为啥strcpy(st1,st2);能全部拷贝,puts(st1);能输出Language呢?
展开
 我来答
匿名用户
2009-02-15
展开全部
虽然没出错,但是很危险

strcpy(st1,st2);
这一句的作用是:
将以st2为起始位置,后面遇到的第一个'\0'为终了位置的字符串,
拷贝到以st1为起始位置的存储区域中。

只要st1和st2的存储空间不出现重叠编译器就不会显式的报错,
只要st2没有拷贝完,就会一直向st1打头的空间写下去,
这样一般就会有两个结果:
1. 正好st1后面的区域也没有被使用,拷贝正常完成
2. 拷贝到一个位置,正在被系统或者其他程序使用,出现异常错误,报错

你碰上的是第一种情况

至于puts(st1);能输出Language呢?
puts函数只管输出以st2为起始位置,到后面遇到的第一个'\0'之间的字符,
所以当然就正常输出了
test_abcd
2009-02-15 · TA获得超过3150个赞
知道大有可为答主
回答量:2162
采纳率:50%
帮助的人:2058万
展开全部
st1是数组,那么数组名就是一个地址,相当于一个指针的意义
而strcpy是一个字符串处理函数 里面的参数都是地址,根本不会去考虑长度
只要首地址正确,'\0'正确 就能够输出
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
slm_201
2009-02-15
知道答主
回答量:10
采纳率:0%
帮助的人:2.8万
展开全部
strcpy是一个不安全的函数,它不会考虑st1的长度,上面的程序已经内存越界了,有可能会造成不可意料的后果。

建议使用strncpy函数

char * strncpy(char *s1,char *s2,size_t n);
将字符串s2中最多n个字符复制到字符数组s1中,返回指向s1的指针。

可以保证内存不被越界
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xuminghui382
2009-02-16 · TA获得超过363个赞
知道小有建树答主
回答量:906
采纳率:50%
帮助的人:0
展开全部
这个问题牵扯到指针的知识点 最主要的就是地址的问题 等学到那里就一切都明白了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
清影星河6A
2009-02-16 · TA获得超过851个赞
知道小有建树答主
回答量:753
采纳率:0%
帮助的人:896万
展开全部
你这样做:
将7改成6,试试
将6改成5,试试
将5改成4,试试
...
看你能坚持到什么时候 ^_^
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式