注册 登录
编程论坛 C++教室

很有意思的strcpy

韩明海 发布于 2010-04-09 18:11, 1239 次点击
下面的小程序段我是在机顶盒软件里运行的,请大家在自己的平台上运行一下,看看结果
char *a;
char *b = "\n";
char s[10];
char a[] = "欢迎大家来尝试,一起进步一起学习,谢谢";
strcpy(s,a);
printf("%s\n%s\n",a,s);
不能输入中文的就随便写几个大于10的字符,你甚至可以把s[10]该成s[1]
我得运行结果是,无论a多长 s 多小,最后输出结果是输出两行一样的文字
13 回复
#2
玩出来的代码2010-04-09 19:05
LZ给的程序很N,
#3
one_june2010-04-09 20:02
为什么把  char *b = "\n"; 注释掉
输出结果上面字符了长度变了...
#4
韩明海2010-04-10 19:38
回复 3楼 one_june
呵呵,那个没用,因为那是我以前做切割时用的,现在不用了,去掉好了,
你应该发现了,定义的数组多长都可以赋值,但是我们一直是以为s只有10不可能接受那么多字符,
#5
pangding2010-04-11 10:29
呵呵~
#6
cyhysr2010-04-11 19:19
也许和strcpy()函数的原型声明有关.
#7
ligt06102010-04-12 11:03
LZ这样做很不安全的,很有可能覆盖其他内容,这也是在c++中不检查数组边界造成的,如果不清楚长度,建议还是用strncpy
当然输出的时候是以‘\0’为结束符,所以你看到整句话输出了
#8
韩明海2010-04-12 16:37
回复 7楼 ligt0610
谢谢,你说的我都明白,我知道越界会破坏别的数据,我只是做个实验,如果空间是连续分配的,我给s定义一个空间后紧接着有给a定一个空间,那它为什么没有破话a的数据呢,
#9
pangding2010-04-14 09:49
你试试这个:
程序代码:

char s[10];
char ss[10];
char a[] = "欢迎大家来尝试,一起进步一起学习,谢谢"
strcpy(s,a);
strcpy(ss,a);
printf("%s\n%s\n",s,ss);


不知道还是不是都一样。呵呵,其实我对你说的编程环境有点兴趣~
#10
韩明海2010-04-14 10:56
回复 9楼 pangding
你回复我,我在哪能看到提示信息,收件箱没有,消息也没有。
多拷贝一次有什么区别么?你想要什么结果?如果是没有目的的乱试,我没兴趣。
你是对机顶盒有兴趣还是对我的服务器有兴趣,我们都是在服务器上运行编写的,我得电脑上没有Linux系统。
#11
南国利剑2010-04-14 10:58
回复 7楼 ligt0610
我也觉得这么做是很危险的,即使是可行的.
#12
ligt06102010-04-15 11:31
你可以看下数组s和a的起始地址,并不是连续的,当数据a的长度超过s与a之间的大小时,程序就出现问题了
#13
pangding2010-04-17 10:43
我想试的大概就是12楼说的那样。这样声明的 s 和 ss 离的很近,应该很快就会覆盖的。
你这程序问题很明显,如果只是你自己不知道会有什么结果,作点小实验很快就会发现问题。
 
你在机顶盒上编程作什么?我有一个同学在学的东西可能和这个有点像,我是不会~~
#14
韩明海2010-04-20 12:52
回复 13楼 pangding
编程还能做什么,就写程序呗,只是我也刚刚工作,做的还比较浅,只是UI部分,呵呵
1