【C】strcpy()需谨慎使用;
大家都知道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."; 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()函数并不会检查目标字符串是否容纳下源字符串,所以使用这两个函数需谨慎使用!