Chinaunix首页 | 论坛 | 博客
  • 博客访问: 293403
  • 博文数量: 70
  • 博客积分: 485
  • 博客等级: 下士
  • 技术积分: 632
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-25 08:55
文章分类

全部博文(70)

文章存档

2014年(47)

2013年(1)

2012年(22)

我的朋友

分类: C/C++

2014-04-18 13:03:46

声明:使用GCC编译

strcat(连接两字符串)

函数定义:char *strcat (char *dest,const char *src)
函数说明:strcat()会将参数src字符串拷贝到参数dest所指的字符串尾,第一个参数dest要有足够的空间来容纳要拷贝的字符串;
返回值:  返回dest字符串参数的起始地址;
接下来分三种情况来看strcat()函数是可行:

方案一:两个参数都是数组

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>

  3. int main(void)
  4. {
  5.     char dest[30] = "Hello";
  6.     char src[] = "World";

  7.     strcat(dest, src);
  8.     printf("dest:[%s]\n", dest);

  9.     return 0;
  10. }

得到的结果是:dest:[HelloWorld]

方案二:两个参数都是指针

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.     char *dest = NULL;
  6.     char *src = "World";

  7.     strcat(dest, src);
  8.     printf("dest:[%s]", dest);

  9.     return 0;
  10. }
  11. ~

得到的结果却是:Segmentation fault (core dumped)竟然是段错误,为什么呢?
    很显然 strcat函数在将src的内容拷贝到dest中是没问题的,但是dest没有足够的空间来存储src中的内容;
修改之后的:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main(void)
  5. {
  6.     char *dest = NULL;
  7.     dest = (char *)malloc(1024);
  8.     char *src = "World";

  9.     strcat(dest, src);
  10.     printf("dest:[%s]", dest);

  11.     return 0;
  12. }
  13. ~

得到的结果为:dest:[World]

方案三:第一个是数组,第二个位指针

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.     char dest[6] = "Hello";
  6.     char *src = "World";

  7.     strcat(dest, src);
  8.     printf("dest:[%s]\n", dest);

  9.     return 0;
  10. }
显示结果:dest:[HelloWorld]为什么会这样呢?不是说要空间足够的时候才可以拷贝成功的么?
    很明显,这属于数组越界的问题,在C语言中
c不检查也不提示,所以这里的拷贝用到了dest[6]后面紧挨着的几个存储单元;
方案四:第一个指针,第二个数组

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void)
  4. {
  5.     char *dest;
  6.     char src[] = "World";

  7.     strcat(dest, src);
  8.     printf("dest:[%s]\n", dest);

  9.     return 0;
  10. }
看到这里,都会知道肯定是dest的空间不足,无法拷贝src中的内容;
所以输出结果是:Segmentation fault (core dumped)
更改之后:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main(void)
  5. {
  6.     char *dest;
  7.     dest = (char *)malloc(1024);
  8.     char src[] = "World";

  9.     strcat(dest, src);
  10.     printf("dest:[%s]\n", dest);

  11.     return 0;
  12. }
OK输出结果是:dest:[World]
O(∩_∩)O哈哈哈~想必这下这个函数不会再出类似的错误了吧
阅读(16190) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~