字符串处理函数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呢? 展开
{
char st1[7],st2[]="Language";
strcpy(st1,st2);
puts(st1);printf("\n");
}
st1[7]长度不够,为啥strcpy(st1,st2);能全部拷贝,puts(st1);能输出Language呢? 展开
5个回答
2009-02-15
展开全部
虽然没出错,但是很危险
strcpy(st1,st2);
这一句的作用是:
将以st2为起始位置,后面遇到的第一个'\0'为终了位置的字符串,
拷贝到以st1为起始位置的存储区域中。
只要st1和st2的存储空间不出现重叠编译器就不会显式的报错,
只要st2没有拷贝完,就会一直向st1打头的空间写下去,
这样一般就会有两个结果:
1. 正好st1后面的区域也没有被使用,拷贝正常完成
2. 拷贝到一个位置,正在被系统或者其他程序使用,出现异常错误,报错
你碰上的是第一种情况
至于puts(st1);能输出Language呢?
puts函数只管输出以st2为起始位置,到后面遇到的第一个'\0'之间的字符,
所以当然就正常输出了
strcpy(st1,st2);
这一句的作用是:
将以st2为起始位置,后面遇到的第一个'\0'为终了位置的字符串,
拷贝到以st1为起始位置的存储区域中。
只要st1和st2的存储空间不出现重叠编译器就不会显式的报错,
只要st2没有拷贝完,就会一直向st1打头的空间写下去,
这样一般就会有两个结果:
1. 正好st1后面的区域也没有被使用,拷贝正常完成
2. 拷贝到一个位置,正在被系统或者其他程序使用,出现异常错误,报错
你碰上的是第一种情况
至于puts(st1);能输出Language呢?
puts函数只管输出以st2为起始位置,到后面遇到的第一个'\0'之间的字符,
所以当然就正常输出了
展开全部
st1是数组,那么数组名就是一个地址,相当于一个指针的意义
而strcpy是一个字符串处理函数 里面的参数都是地址,根本不会去考虑长度
只要首地址正确,'\0'正确 就能够输出
而strcpy是一个字符串处理函数 里面的参数都是地址,根本不会去考虑长度
只要首地址正确,'\0'正确 就能够输出
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
strcpy是一个不安全的函数,它不会考虑st1的长度,上面的程序已经内存越界了,有可能会造成不可意料的后果。
建议使用strncpy函数
char * strncpy(char *s1,char *s2,size_t n);
将字符串s2中最多n个字符复制到字符数组s1中,返回指向s1的指针。
可以保证内存不被越界
建议使用strncpy函数
char * strncpy(char *s1,char *s2,size_t n);
将字符串s2中最多n个字符复制到字符数组s1中,返回指向s1的指针。
可以保证内存不被越界
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个问题牵扯到指针的知识点 最主要的就是地址的问题 等学到那里就一切都明白了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这样做:
将7改成6,试试
将6改成5,试试
将5改成4,试试
...
看你能坚持到什么时候 ^_^
将7改成6,试试
将6改成5,试试
将5改成4,试试
...
看你能坚持到什么时候 ^_^
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询