strcat的应用

来源:互联网 发布:google tensorflow教程 编辑:程序博客网 时间:2024/04/27 18:17
函数定义: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]
原文:http://blog.chinaunix.net/uid-26914516-id-4215338.html

【FROM MSDN && 百科】

原型:char *strcat(char *dest,const char *src);

#include<string.h>

Append a string.

把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

返回指向dest的指针。

DEMO1:实现自己的strcat函数

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <conio.h>  
  3. #include <assert.h>  
  4. char *my_strcat(char *dest,const char *src)  //将源字符串加const,表明其为输入参数  
  5. {  
  6.     char *strDest=dest;  
  7.     assert(dest!=NULL && src!=NULL);       //对源地址和目的地址加非0断言  
  8.     //here  
  9.     //若使用while(*Dest++),则会出错,指向'\0'之后,会出现dest++,则指向了个'\0'的下一个位置,  
  10.     while(*dest !='\0')                     
  11.     {  
  12.         dest++;      //循环体内的++可以使指向字符串结束标志'\0'  
  13.     }  
  14.     while((*dest++=*src++)!='\0');  
  15.     return strDest;   ////为了实现链式操作,将目的地址返回  
  16. }  
  17.   
  18. int main(void)  
  19. {  
  20.     char str1[20]="hello";   // sufficent space   
  21.     char str2[]=" world";  
  22.     my_strcat(str1,str2);  
  23.     printf("%s\n",str1);  
  24.     getch();  
  25.     return 0;  
  26. }  

DEMO2: strcpy && strcat

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <conio.h>  
  3. /*strcpy && strcat*/  
  4. int main(void)  
  5. {  
  6.     char string[80];  
  7.     strcpy(string,"Hello world from ");  
  8.     strcat(string,"strcpy ");  
  9.     strcat(string,"and ");  
  10.     strcat(string,"strcat!");  
  11.     printf("string = %s \n",string);  
  12.     getch();  
  13.     return 0;  
  14. }  
结果输出:string = Hello world from strcpy and strcat!

DEMO3:str1 + str2  =str3

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <conio.h>  
  3. #include <assert.h>  
  4. #include <string.h>  
  5. #include <malloc.h>  
  6. #pragma  warning (disable:4996)  
  7. int main(void)  
  8. {  
  9.     char *str1="Welcome ! ";  
  10.     char *str2="Hello,world!";  
  11.     char *str3;  
  12.     str3=(char*)malloc(strlen(str1)+strlen(str2)+1);  //申请空间  
  13.     //assert(str3);  
  14.     if (str3 == NULL)  
  15.     {  
  16.         fprintf(stderr,"malloc failed......!\n");  
  17.     }  
  18.     strcpy(str3,str1);   //拷贝  
  19.     strcat(str3,str2);   //appending  
  20.     printf("str1 is %s\n",str1);  
  21.     printf("str2 is %s\n",str2);  
  22.     printf("str1 + str2 is %s\n",str3);  
  23.     free(str3);               //malloc的内存记得要free掉  
  24.     getch();  
  25.     return 0;  
  26. }  
原文:http://blog.csdn.net/hgj125073/article/details/8439448

0 0