博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C】strcpy()需谨慎使用;
阅读量:4641 次
发布时间:2019-06-09

本文共 1460 字,大约阅读时间需要 4 分钟。

  大家都知道C中的strcpy()函数是用来复制字符串的库函数。先附上代码看看strcpy()函数的功能:

1 #include
2 #include
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
2 #include
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
2 #include
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()函数并不会检查目标字符串是否容纳下源字符串,所以使用这两个函数需谨慎使用!

转载于:https://www.cnblogs.com/ngnetboy/archive/2012/11/19/2777384.html

你可能感兴趣的文章
[转]优化Flash性能
查看>>
popStar手机游戏机机对战程序
查看>>
Java Web项目结构
查看>>
lambda表达式树
查看>>
OpenCV YUV 与 RGB的互转(草稿)
查看>>
二次注入原理及防御
查看>>
会话记住已登录功能
查看>>
Linux内核分析——可执行程序的装载
查看>>
儿子和女儿——解释器和编译器的区别与联系
查看>>
第一阶段冲刺3
查看>>
父类引用指向子类对象
查看>>
网页如何实现下载功能
查看>>
IT男专用表白程序
查看>>
读《大道至简》第六章感想
查看>>
ef linq 中判断实体中是否包含某集合
查看>>
章三 链表
查看>>
Solution for Concurrent number of AOS' for this application exceeds the licensed number
查看>>
CSE 3100 Systems Programming
查看>>
IntelliJ IDEA 的Project structure说明
查看>>
Java Security(JCE基本概念)
查看>>