C语言实现strcat
首先看看代码:
#ifndef STRCAT_H
#define STRCAT_H /*******************************************************************
原型:extern char *strcat(char *dest,char *src); strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;
dest最后的结束字符NULL会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。 返回指向dest的指针。 注意:dest 与 src 所指的内存空间不能重叠,
且 dest 要有足够的空间来容纳要复制的字符串。 *******************************************************************
拓展:
* 有两个意思,理论上
作为 乘法 运算符,级别低于 ++(自增)。
作为 指针取值 运算符,级别同 ++(自增)一样。 *p++; 很令人混淆。它不是 *p = *p + 1; 而是 *p = *(p+1);
*******************************************************************/ #include <stdio.h> char *cat_stacat(char *dst, const char *src) {
if (NULL == dst && NULL == src)
return NULL; char *addr = dst; // 方法1:
// Notice: 注意方法1和2的区别!方法1的话,最后一次循环dst加了1,最终指向字符串结束符'\0'的下一字节
// 如果不--dst。则最后可能是“hello\0world”,遇到\0就结束,所以只会输出hello
/*while (*dst++) ;
--dst;*/ // 方法2:
while (*dst)
++dst; while (*dst++ = *src++) ; *dst = '\0'; // return addr; // 返回指向dst的指针
} #endif
main:
#include "strcat.h"
void test_strcat();
int main() {
test_strcat();
return ;
}
void test_strcat() {
char dst[] = { "hello" }; // 保证dst有足够的空间
char *ret = cat_stacat(dst, " world!");
printf("%s\n%s\n", ret, dst);
}
注意!!!
// 方法1:
// Notice: 注意方法1和2的区别!方法1的话,最后一次循环dst加了1,最终指向字符串结束符'\0'的下一字节
while (*dst++) ;
--dst; // 方法2:
while (*dst)
++dst;
注意这2种写法的区别!!!
让我看看while(*p++ !=‘\0’)的秘密。原以为跳出后,p指向'\0',而实际上并非如此!这样子怎么拼接都实现不了。为了验证这个问题,我们先上个小程序吧:
#include<stdio.h>
void main()
{
char *p = "abcdefg";
while(*p++ != 'c');
printf("%c\n", *p);
}
您猜打印出来的是几? 结果是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
C语言实现strcat的更多相关文章
- c语言,strcat(),字符串拼接
#include<stdio.h> #include<string.h> int main() { char destination[25]; char *zhang=& ...
- C语言简单strcat和strcmp的实现
对于C标准库中的字符串处理函数应该平常用的比较多:简单实现strcat和strcmp _strcpy: char *_strcpy(char *dest, char *src) { char *buf ...
- C语言函数-strcat
strcat: 将两个char类型连接. char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s); 结果放 ...
- C语言实现strcat / strlen / strcmp / strcpy
主要考虑两点: 返回值对使用的便利性. 边界,null的判断. strcat char *m_strcat(char *des, const char *src) { assert((des != N ...
- Redis数据结构之简单动态字符串SDS
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...
- makefile :=和+=
经常有人分不清= .:=和+=的区别 这里我总结下做下详细的分析: 首先你得清楚makefile的运行环境,因为我是linux系统,那么我得运行环境是shell 在Linux的shell里,shel ...
- makefile中=、:=和+=的区别
经常有人分不清= .:=和+=的区别 这里我总结下做下详细的分析: 首先你得清楚makefile的运行环境,因为我是linux系统,那么我得运行环境是shell 在Linux的shell里,shel ...
- Redis 底层数据结构之String
文章参考:<Redis设计与实现>黄建宏 Redis 的 string 类型底层使用的是 SDS(动态字符串) 实现的, 具体数据结构如下: struct sdshdr { int len ...
- 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...
随机推荐
- Windows7配置GPU和Theano编程环境
可参考Windows安装Theano官方教程: http://deeplearning.net/software/theano/install_windows.html#install-windows ...
- vim快捷键笔记【原创】
Vim zR 全部展开 zM全部合并 vim 快捷键 shift + i (‘I’) 进行编辑 shift + 4 (‘$’) 跳到行尾 shift ...
- Ubuntu Server搭建svn服务以及迁移方法【转】
转自:http://www.linuxidc.com/Linux/2013-05/84693.htm Ubuntu Server搭建svn服务以及迁移方法 采用apache+svn,http访问方式. ...
- objective-c 与 js之间传递中文乱码
最近在做关于js改写oc framework的小project,遇到了不少问题 其中刚遇到的是关于如何在两者之间传递中文字符,带特殊字符的URL字符串 不会很详细的介绍太多,以后会回头做个总结 oc传 ...
- Headfirst JSP 01 (概述)
HTTP 协议 http 是tcp/ip上层协议, 如果你对这些网络协议还不是太熟悉, 下面提供一个非常简单的解释, tcp负责确保从一个网络节点向另一个网络节点发送文件能作为一个完整的文件到达目的地 ...
- jquery常用代码集锦
1. 如何修改jquery默认编码(例如默认GB2312改成 UTF-8 ) 1 2 3 4 5 $.ajaxSetup({ ajaxSettings : { contentT ...
- Hack 【二分答案】
题意:给出n门课程,每一门课程考的分数,每一门课程的学分,求最多删去k组数据之后能够得到的最大加权平均数 先开一个数组x[],其中x[i]=1代表没有删除这门课程,x[i]=0表示删除了这门课程 然后 ...
- WEBUS2.0 In Action - 搜索操作指南 - (3)
上一篇:WEBUS2.0 In Action - 搜索操作指南(2) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(4) 3. 评分机制 (Webus.Search.IHitSc ...
- Eclipse使用代码清理功能(Clean Up)
本文转载自http://www.ibm.com/developerworks/cn/opensource/os-eclipse-clean/ 但是为了适应自己使用,还是自己总结了一下. 一.概述 代码 ...
- BZOJ 1724 切割木板
合并果子. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...