Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48674
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 75
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-08 12:36
文章分类

全部博文(11)

文章存档

2014年(3)

2013年(8)

我的朋友

分类: C/C++

2013-05-18 14:15:31

strcpy函数的原型是
char *strcpy(char *strDest, const char *strScr)
{
       char *address=strDest;
       assert((strDest != NULL) && (strScr != NULL));  //是判断传进来的指针是否为空 如果为空返回一个错误值
       while(*strScr)                   //是while(*strScr != ’\0’)的简化形式;
       {
              *strDest++ = *strScr++;
       }
       *strDest = '\0';                       //当strScr字符串长度小于原strDest字符串长度
       return address;                      //时,如果没有改语句,就会出错了。
}
可能在大多数人用strcpy函数时,都会有个约束,就是原字符串的长度要小于要拷贝目标字符串的长度,也就是*strScr小于

*strDest,我们在定义字符串时,就会赋予其长度。
例如:
 char str_dest[20];
 char str_scr[10];
 strcpy(str_dest, str_scr);
 这样就把str_scr字符串中的内容拷贝到str_dest字符串中了
可是有时候我们会不小心把*strScr的长度大于*strDest的长度了 这时会有什么效果呢
就比如:
 char str_dest[10];
 char str_scr[20];
 strcpy(str_dest, str_scr);
我的验证是,程序并不好报错,它会继续输出str_scr中的内容;
举个简单的例子:
  # include
  # include
  int main()
  {
      char str1[3];
      char str2[20]={"this is a test"};
      strcpy(str1, str2);
      printf("%s\n", str1);

      return 0;
  }
 运行结果: this is a test
这时我们会把目光注视到原函数上,我们发现strcpy的原函数并没有加两个字符串长度的限制条件,它只是把原字符串中的内容

一个一个地赋值到目标字符串中,而且到最后还给目标字符串加上了结束符“\0”。那么如果目标字符串长度不够时会怎么样呢

? 笔者认为 它会继续一个一个地赋值字符。 拿上面的例子 str1[3], str2[20]="this is a test", str2往str1里赋值。当

str2里的thi 到s 的时候,str1的长度不够了,但是数字中的地址是连续的,比如str1的首地址是1000,那么str1[0]

=1000,str1[1]=1001,str1[2]=1002, 这个时候还要继续往str1里赋值,怎么办,地址还会继续增加的,那么继续增加的地址是我

们没有申请的空间的,这样的话就会很危险的,如果没有申请的地址空间没有被系统占用还好,如果被系统占用的话系统可能就

会崩溃的,所以在使用strcpy函数时要小心谨慎, 原字符串长度要小于目标字符串的长度。

 

阅读(2977) | 评论(0) | 转发(0) |
0

上一篇:Linux Shell 学习 03

下一篇:Linux Shell 学习 04

给主人留下些什么吧!~~