C语言实现strcat

首先看看代码:

 1 #ifndef STRCAT_H
 2 #define STRCAT_H
 3
 4 /*******************************************************************
 5 原型:extern char *strcat(char *dest,char *src);
 6
 7 strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;
 8 dest最后的结束字符NULL会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。
 9
10 返回指向dest的指针。
11
12 注意:dest 与 src 所指的内存空间不能重叠,
13     且 dest 要有足够的空间来容纳要复制的字符串。
14
15 *******************************************************************
16 拓展:
17     * 有两个意思,理论上
18     作为 乘法 运算符,级别低于 ++(自增)。
19     作为 指针取值 运算符,级别同 ++(自增)一样。
20
21     *p++; 很令人混淆。它不是 *p = *p + 1;  而是 *p = *(p+1);
22 *******************************************************************/
23
24 #include <stdio.h>
25
26 char *cat_stacat(char *dst, const char *src) {
27     if (NULL == dst && NULL == src)
28         return NULL;
29
30     char *addr = dst;
31
32     // 方法1:
33     // Notice: 注意方法1和2的区别!方法1的话,最后一次循环dst加了1,最终指向字符串结束符‘\0‘的下一字节       // 如果不--dst。则最后可能是“hello\0world”,遇到\0就结束,所以只会输出hello
34     /*while (*dst++) ;
35     --dst;*/
36
37     // 方法2:
38     while (*dst)
39         ++dst;
40
41     while (*dst++ = *src++) ;
42
43     *dst = ‘\0‘; //
44
45
46     return addr; // 返回指向dst的指针
47 }
48
49
50 #endif

main:

 1 #include "strcat.h"
 2
 3 void test_strcat();
 4
 5 int main() {
 6
 7     test_strcat();
 8
 9     return 0;
10 }
11
12 void test_strcat() {
13     char dst[64] = { "hello" }; // 保证dst有足够的空间
14
15     char *ret = cat_stacat(dst, " world!");
16
17     printf("%s\n%s\n", ret, dst);
18 }

注意!!!

1 // 方法1:
2     // Notice: 注意方法1和2的区别!方法1的话,最后一次循环dst加了1,最终指向字符串结束符‘\0‘的下一字节
3     while (*dst++) ;
4     --dst;
5
6     // 方法2:
7     while (*dst)
8         ++dst;

注意这2种写法的区别!!!

让我看看while(*p++ !=‘\0’)的秘密。原以为跳出后,p指向‘\0‘,而实际上并非如此!这样子怎么拼接都实现不了。为了验证这个问题,我们先上个小程序吧:

 1 #include<stdio.h>
 2
 3 void main()
 4
 5 {
 6
 7    char *p = "abcdefg";
 8
 9    while(*p++ != ‘c‘);
10
11   printf("%c\n", *p);
12
13 }

  您猜打印出来的是几? 结果是d

  为什么呢?

  原来*和++的优先级是一样的,当优先级一样的时候,程序按自左至右的顺序执行。所以当*p = ‘c‘ 或者*p = ‘\0‘时,p仍然要往下移一位,即p指向满足条件后的下一个字节。(cat_strcat函数代码中的最后一次循环dst加了1,最终指向字符串结束符‘\0‘的下一字节)

  由于‘\0‘ 结束符,if 、while当会把他判成0,因此程序写成while(*p++ );效果也一样,最终程序指向字符串结束符‘\0‘的下一字节。

  如果这样写:

while(*p)

p++;

  当*p=‘\0‘时,进不到while里面的循环,因此这种写法跳出循环的时候,p指向的是‘\0‘。同志们注意了,这样写while后面是没有“;”号的。

//===========================================================//

  最后,main函数输出的ret和dst的字符串是一样的!!

  既然一样,为什么还需要返回那个值呢?岂不是多此一举?

  原因其实很简单,我们写c代码的时候,常会用到链式调用。

  即:通过返回首地址可以实现像strcat(strcat(dst, str1), str2);一样的用法!!!

  在前面实现strcpy的博文中也说到了这点:http://www.cnblogs.com/lingshaohu/p/3961132.html

参考:http://blog.csdn.net/yanzi1225627/article/details/7843672

时间: 2024-10-15 06:54:28

C语言实现strcat的相关文章

C语言简单strcat和strcmp的实现

对于C标准库中的字符串处理函数应该平常用的比较多:简单实现strcat和strcmp _strcpy: 1 char *_strcpy(char *dest, char *src) 2 { 3 char *buf = dest; 4 while((*dest++ = *src++)) 5 ; 6 return buf; 7 } _strcmp: 1 int _strcmp(char *str1, char *str2) 2 { 3 if(str1 == NULL || str2 == NULL)

【C语言】strcat函数的实现

strcat: 将两个char类型链接. 返回指向字符串的指针. 然后我们简单实现一下这个函数: <span style="font-size:18px;">#include<stdio.h> #include<assert.h> char * my_strcat(char *str1,char const *str2) { char* tmp=str1; assert(str1); assert(str2); while(*str1!='\0')

makefile中=、:=和+=的区别

经常有人分不清= .:=和+=的区别  这里我总结下做下详细的分析: 首先你得清楚makefile的运行环境,因为我是linux系统,那么我得运行环境是shell 在Linux的shell里,shell只认识字符串,所以你就不要说整形什么的了.说值也不贴切. 先看+=是什么意思? 因为shell只认识字符串,所以这里应该不难联想到+=就是字符串连接的意思.相当于c语言的  strcat 举个例子: x本来是  U: x += SB: 那么运行结果就是  x为USB: 接着理解:=和= 这个是很常

Redis数据结构之简单动态字符串SDS

Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话,是远远不足以应对面试提问的.本文简单介绍了Redis底层最重要的数据结构 - 简单动态字符串(SDS) Redis使用C语言开发,但并没有使用C语言传统的字符串表示(以空字符结尾的字节数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串的(simple dynamic string,SDS

C语言::模拟实现strcat函数

题目要求 编写一个C语言程序模拟实现strcat函数. (我们不妨先模拟实现一下strcat函数,然后再对照一下string.h库函数中strcat函数代码的实现,与大师肩并肩.) 算法分析 strcat函数功能:将两个字符串连接起来,最终返回连接后字符串的首地址. strcat函数原型:char *strcat(char *dest,const char *src); 我们清楚地了解了strcat函数功能和原型之后,就很容易分析出算法... 算法总结 第一步:将dest指向的内容循环遍历至'\

转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 作者:jcsu C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen5. 字符串连接 - strcat6. 字符串比较 - strcmp7. 计算字符串中的元音字符个数8. 判断一个字符串是否是回文1. 写一个函数实现字符串反转 版本1 - while版 void strRev(char *s){    

C语言实现strlen()4种方法和strcat()3种方法

#include <stdio.h> #include <assert.h> #if 0 // 默认使用法4 // 法1 int strlen(const char* str) { int n; // const char *p = str; //测试这句,这个语句不需要,因为我实参是指针,形参指针改变指向不影响实参指向 for(n = 0; *str != '\0'; n++) { str++; } return n; } #elif 0 // 法2 int strlen(con

C语言strcat,ctrcpy函数原型和改进

函数原型如下: char *strcpy(char *strDest, const char *strSrc) { char *address=strDest; assert((strDest!=NULL) && (strSrc!=NULL)); while(*strSrc!='\0') { *strDest++=*strSrc++; } *strDest='\0'; return address; } char *strcat(char *strDest, const char *str

C语言strcat()函数:连接字符串

头文件:#include <string.h> strcat() 函数用来连接字符串,其原型为:    char *strcat(char *dest, const char *src); [参数]dest 为目的字符串指针,src 为源字符串指针. strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部:dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL. 注意:dest 与 src 所指的内存空间不能重叠,且 dest 要