字符串处理函数strcpy()

来源:百度知道 编辑:UC知道 时间:2024/06/08 19:36:18
main()
{
char st1[7],st2[]="Language";
strcpy(st1,st2);
puts(st1);printf("\n");
}
st1[7]长度不够,为啥strcpy(st1,st2);能全部拷贝,puts(st1);能输出Language呢?

虽然没出错,但是很危险

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

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

你碰上的是第一种情况

至于puts(st1);能输出Language呢?
puts函数只管输出以st2为起始位置,到后面遇到的第一个'\0'之间的字符,
所以当然就正常输出了

st1是数组,那么数组名就是一个地址,相当于一个指针的意义
而strcpy是一个字符串处理函数 里面的参数都是地址,根本不会去考虑长度
只要首地址正确,'\0'正确 就能够输出

你这样做:
将7改成6,试试
将6改成5,试试
将5改成4,试试
...
看你能坚持到什么时候 ^_^

strcpy是一个不安全的函数,它不会考虑st1的长度,上面的程序已经内存越界了,有可能会造成不可意料的后果。

建议使用strncpy函数

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

可以保证内存不被越界

这个问题牵扯到指针的知识点 最主要的就是地址的问题 等学到那里就一切都明白了