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. ...
随机推荐
- PHP也20岁了
当今许多世界著名的编程语言的年纪已经够大了.举个例子,PHP昨天过了生日已经20岁了,Python也24岁,HTML已经服务了22年,Ruby和JavaScript有20年,Java前段时间刚过了20 ...
- 详细记录python的range()函数用法
使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的slide,最后分析一个好玩儿的冒泡程序. 这里记 ...
- 编译android出错
注意:frameworks/base/nfc-extras/java/com/android/nfc_extras/NfcAdapterExtras.java 使用了未经检查或不安全的操作.注意:要了 ...
- MINA经典入门例子----Time Server
原文地址 http://blog.sina.com.cn/s/blog_720bdf0501010b8r.html 貌似java的IO.NIO的入门例子都有相关的Time Server Demo.本例 ...
- binary-tree-maximum-path-sum(mock)
注意: // 注意,如果一个类放在另一个类里面,初始化时候会报错 Solution is not a enclosing class// 这是因为如果TreeNode不是static,那么要求先有外部 ...
- git项目实战常用workflow和命令
一个从无到有的项目大体经历-创建项目目录,创建repo,配置过滤集,配置git user,导入已有基础代码入库,将库放到central去,建立分支,修改代码,checkin代码,分支上 测试验证代码, ...
- website project team member 角色及开发过程概念图
一个web项目的团队往往具有以下角色的人员组成: project stakeholder(client or business owner)产品经理 Project manager 项目经理 prod ...
- Qt之QProgressIndicator(等待提示框)
简述 很早以前在网上看到一个纯代码实现的旋转动画感觉效果很不错,分享给大家.不得不说,条条大道通罗马,我们需要更多地创造... 详见:QProgressIndicator 简述 效果 源码 使用 更多 ...
- 基于jQuery的日历插件
上个星期看到同事做一个有关日历提醒功能的需求,为了找个插件也是费了不少心思,然后刚好有时间就试着写了一个简单demo 来看下最终效果图吧: 是长得丑了一点,不要吐槽我-.- 首先来说说这个日历主要的制 ...
- 浅谈 Scala 中下划线的用途
Scala 作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之外,还有语法层面的,比如 underscore(下划线)就会出现在多种场合,令初学者相当疑惑,今天就 ...