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. ...
随机推荐
- Case 架构的实际应用-1
We use testlink to manage cases, and the frame is below: Project Name -All Features(Modules) -Featur ...
- KVM/QEMU桥接网络设置及kvm资料
KVM/QEMU桥接网络设置 配置kvm的网络有2种方法.其一,默认方式为用户模式网络(Usermode Networking),数据包由NAT方式通过主机的接口进行传送.其二,使用桥接方式(Brid ...
- linux之应用开发杂记(一)
1.Shell 当前目录 $(pwd) 2.Samba的配置 sudo apt-get install samba Samba的配置文件是/etc/samba/smb.conf [global] se ...
- 关于c#字典key不存在的测试
之前一直隐约记得没有创建key会报异常,测试了下. 测试结果: 写入值,如果不存在key,会自动创建. 取值,如果不存在key,会报异常. 一般用c#提供了尝试取值方法,不过有out参数,考虑写扩展 ...
- 自动化测试之python安装
1.首先访问http://www.python.org/download/去下载最新的python版本. 2.安装下载包,一路next. 3.为计算机添加安装目录搭到环境变量,如图把python的安装 ...
- BZOJ 2006 超级钢琴(划分树+优先队列)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2006 题意: 给出一个数列A,L,R,构造出一个新的集合,集合中的数字为A中任意连续t( ...
- [HDOJ1043]Eight(康托展开 BFS 打表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 八数码问题,因为固定了位置所以以目标位置开始搜索,把所有情况(相当于一个排列)都记录下来,用康托 ...
- Lepus经历收获杂谈(二)——QT
QT简介及相关使用指南 1.QT Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器.Qt是面向对象的框 ...
- 头文件中的#ifndef/#define/#endif 的作用
在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定 ...
- 观察者模式最佳案例实现[JAVA][原创]
/** * American Stock Exchange market(ASE) has a list of stocks.A stock object has two perspective in ...