【转自:博客园】【C】strcpy()需谨慎使用;
c语言吧
全部回复
仅看楼主
level 12
大家都知道C中的strcpy()函数是用来复制字符串的库函数。先附上代码看看strcpy()函数的功能:
1 #include<stdio.h>
2 #include<
string.h>
3
#define MAX 20
4
5
int main(
void
)
6
{
7
char a[MAX]=
"
abc
"
;
8
char b[MAX]=
"
abcdefghi
"
;
9
strcpy(a,b);
10
puts(a);
11
puts(b);
12 }
很明显,结果如下:
  此函数中还有两个高级属性——   ①:它是char *类型,它返回的是第一个参数的值,即一个字符的地址。   ②:第一个参数不需要指向数组的开始。
先附上代码来说明这两个属性:
1 #include<stdio.h>
2 #include<
string.h>
3
#define MAX 40
4
5
int main(
void
)
6
{
7
char *a=
"
beast
"
;
8
char b[MAX]=
"
you are the beast one.
"
;
2012年11月21日 08点11分 1
level 12

9
char *
p;
10 p=strcpy(b+
8
,a);
11
puts(a);
12
puts(b);
13
puts(p);
14 }
b+8的位置是the的第一个字母t,看到这个代码你是不是认为结果如下: beast you ate beasteast one beasteast one 应该是这样吗?结果呢?
为什么会这样呢?我们再来看看strcpy()函数的功能:将一个字符串复制到另一个字符串。这个代码无疑是把字符串a复制到b的第八个位置之后。但是字符串的特性是什么呢?字符串最后一个字节存放的是一个空字符——“\0”,用来表示字符串的结束。把a复制到b之后会令a的空字符把复制后的字符串隔断,所以会显示到beast就会结束。而输出p怎么会输出beast呢?这就是此函数的第一个属性,此函数会返回复制之后的字符串的首地址。所以········你懂得。可能到这里你已经发现了一些问题,如果想把一个字符串的一部分复制到另一个字符串的某个位置,该怎么办呢,显然strcpy()函数是满足不了这个功能的,strncpy()函数是为了弥补strcpy()函数不能检查目标字符串是否容纳下源字符串的不足而设定的一个函数。并且完全可以实现这个功能。
附上代码如下:
1 #include<stdio.h>
2 #include<
string.h>
3
#define MAX 30
4
5
int main(
void
)
6
{
7
char *a=
"
abcdefg
"
;
8
char b[MAX]=
"
you are the beast one.
"
;
9 strncpy(b+
4,a,
3
);
10
puts(b);
11 }
这段代码把字符串a的前三个字符赋值到b的第五个位置之后,所以结果如下:
由于strcpy()函数和gets()函数并不会检查目标字符串是否容纳下源字符串,所以使用这两个函数需谨慎使用!
2012年11月21日 08点11分 2
level 4
[俯卧撑]
2012年11月21日 09点11分 3
level 14
you are the beast one
[拜]
2012年11月21日 09点11分 4
[恭喜发财]
2013年01月25日 12点01分
level 10
很正常,复制后是you are best\0...这样是
正确的
2012年11月21日 09点11分 5
level 11
又知道了一个函数。。
2013年01月24日 22点01分 9
level 11
2013年01月25日 00点01分 11
level 11
strncpy fgets
2013年01月25日 00点01分 12
level 1
不预订相等或者大于源数据的空间就进行pchar的copy的人是傻13么?
2013年01月25日 02点01分 13
是。
2013年01月25日 12点01分
level 14
长姿势了!!!
2013年01月25日 04点01分 15
level 8
strcpy()是返回被复制的那个字符串的首地址吧
2013年01月25日 04点01分 16
返回复制后产生的某一片段新字符串的首地址吧……
2013年01月26日 03点01分
level 1
strncpy 属于被误用的函数(它的 n 本来的意思不是这么用的)。snprintf 的 n 是 ISO 向用户妥协的产物,VC 扩展中的 _snprintf 是其本意。
2013年01月26日 20点01分 17
level 1
缓冲区溢出漏洞就是这样产生的。C中涉及数组,指针操作都有这种危险,如printf,strcpy等。
下面是个例子,有兴趣的可以试试
#include <stdio.h>
int func()
{
printf("WIN!\n");
exit(0);
return 0;
}
int main()
{
int a[2];
a[3]=func;
return 0;
}
2013年01月29日 03点01分 20
level 11
毫无意义. gets和strcpy虽然都可能引起同样的问题, 但显然, 不应该使用的是gets, 而strcpy 的安全性应当由程序员来保证, 滥用了别怪函数怪自己.
另, strncpy对个人来说, 也是绝对不应该使用的.
2013年01月29日 03点01分 21
level 7
数组越界问题?
2013年01月30日 00点01分 23
level 1
遵爪孜坐赚
2013年01月31日 05点01分 24
level 13
个人觉得gets不应该用。。用户输入数据无法预测。。万一输入多了程序员总不能咬他一口。。但是strcpy是程序员用的。。自己213长度不给够傻傻地开始copy。。除了证明自己二缺关函数什么事
2013年01月31日 06点01分 25
level 11
内置类型请谨慎使用, 你不知道什么时候就溢出或者FPE了
2013年01月31日 06点01分 26
[啊!]
2013年02月01日 00点02分
level 13
[汗]压力山大
2013年01月31日 06点01分 27
1