码海拾遗:strstr()、strcmp()和strcpy()实现
1、strstr()实现
原型:char * strstr(const char * str1, const char * str2)
说明:判断str2是否为str1的子串,如果是则返回str2第一次出现的位置,否则返回NULL
实现:
char * strstr(const char * str1, const char * str2)
{
if (NULL == str1 || NULL == str2)
return NULL; while (*str1++ != '\0')
{
for (int i = ; *(str1 + i) == *(str2 + i); ++i)
if (*(str2 + i + ) == '\0')
return (char*)str1;
}
return NULL;
}
2、strcmp实现
原型:int strcmp(const char *s1,const char *s2);
说明:比较字符串s1和s2的大小,如果s1>s2 ,返回大于0的整数,如果s1==s2 ,返回0,如果s1<s2,返回小于0的整数。
实现:
int strcmp(const char *s1, const char *s2)
{
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
return ((unsigned char*)s1 - (unsigned char*)s2);
}
3、strcpy实现
原型:char* strcpy(char *dst, const char *src)
说明:把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间
实现:
char * memcpy(char * dst, const char * src, unsigned len)
{
if (NULL == dst || NULL == src)
return NULL; char *rtn = dst; if (dst >= src && dst <= src + len - )//考虑到可能出现部分地址重叠
{
src += len - ;
dst += len - ;
while (len--)
*dst-- = *src--;
}
else
while (len--)
*dst++ = *src++; return rtn;
} unsigned strlen(const char *str)
{
if (NULL == str)
return -; unsigned len = ;
while (*str++ != '\0')
len++; return len;
} char* strcpy(char *dst, const char *src)
{
if (NULL == dst || NULL == src)
return NULL; char *rtn = dst;
memcpy(dst, src, strlen(src)+);
/*等同于
memcpy(dst, src, strlen(src));
dst[strlen(src)] = '\0';
*/
return rtn;
}
PS: 既然是自己实现这两个函数,就不用C标准提供的函数了
码海拾遗:strstr()、strcmp()和strcpy()实现的更多相关文章
- 码海拾遗:strcpy()、strncpy()和strcpy_s()区别
1.strcpy() 原型:char *strcpy(char *dst,const char *src) 功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括'\0'结束符,返回ds ...
- 码海拾遗:基于MySQL Connector/C++的MySQL操作(连接池)
1.MySQL安装及简单设置 (1)安装:在OSX系统下,可以使用万能的“brew install”命令来进行安装:brew isntall mysql(默认安装最新版的MySQL) (2)启动:br ...
- 码海拾遗:Linux常用命令(一)
一.Linux系统安装 系统安装可以分两类:实体机安装Linux,虚拟机(常用虚拟机软件有两种:VMware和VirtualBox)安装Linux. 安装过程网上有很多教程,这里就不赘述了. 二.常用 ...
- 码海拾遗:简单Socket(TCP)类实现
最近刚开始啃Unix网络编程(卷1:套接字联网API),为加深TCP连接的建立和终止的理解与记忆,记下本文,方便以后翻看. 同时留下的还有简单的Socket(TCP)类: mySocket.h #pr ...
- 码海拾遗:Linux多线程mutex锁
多线程计数,每个线程累加10个数. 实现: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
- 码海拾遗:简述C++(一)
C++是Bjarne Stroustrup博士于1982年,在C语言的基础上引入并扩充了面向对象的概念后发明的一种新的程序语言.就与C语言的渊源而言,C++可以说是C语言的超集,它兼容C的一切(可能是 ...
- 内存及字符串操作篇strlen strchar strcmp strcoll strcpy strdup strstr strtok strspn strrchr bcmp bcopy bzero index memccpy memset
bcmp(比较内存内容) 相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp 表头文件 #include<string.h> 定 ...
- c/c++面试题(3)strcat/strcmp/strlen/strcpy的实现
1.编写一个函数实现strlen以及strcpy函数. strcpy函数. 后面的字符串拷贝到一个字符数组中,要求拷贝好的字符串在字符数组的首 地址,并且只拷贝到'\0'的位置.原型是 char* m ...
- C语言实现strcmp()和strcpy()函数
#include <stdio.h> #include <assert.h> char *strcpy(char *strDest, const char *strScr) { ...
随机推荐
- 5.docker image (镜像)
1.image 是什么 是文件和 meta data 的集合 (root filesystem) 是分层的,并且每一层都可以添加改变删除文件,成为一个新的image 不同的image可以共享相同的la ...
- Window命令行切换命令
Windows 命令行切换目录 特别注意:切换到其它盘符不需要 cd 命令 1. 切换到 C 盘根目录 打开终端 cmd 后,输入cd C:\(一定要加上后面的反斜扛) 2.切换到 C 盘子目录 打开 ...
- python 3.6
安装了最新版anaconda3-4.3 发现jupyter-notebook 少了一些东西.需要手工安装 https://github.com/Anaconda-Platform/nbpresent
- Flume(二) —— 自定义拦截器、Source、Sink
自定义拦截器 自定义Source 自定义Sink 引入依赖 <dependency> <groupId>org.apache.flume</groupId> < ...
- [LC] 809. Expressive Words
Example: Input: S = "heeellooo" words = ["hello", "hi", "helo&quo ...
- RegexUtil
package org.linlinjava.litemall.core.util; import java.util.ArrayList; import java.util.Collections; ...
- 吴裕雄--天生自然python机器学习:Logistic回归
假设现在有一些数据点,我们用 一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类 ...
- linux重定向与管道符(一)
linux重定向和管道符 为什么要使用重定向 1.当屏幕输出的信息很重要,而且我们需要将他存下来的时候: 2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时: 3.系统的例行命令,例如定时任务的执 ...
- Codeforces Round #572 (Div. 1) 差E
Codeforces Round #572 (Div. 1) A2 题意:给一棵树,带边权,互不相同且为偶数.每次操作是选两个叶子然后在路径上同时加一个数.初始边权全是0,求一个操作序列使得最终边权与 ...
- python学习笔记(24)-类与对象
#类与对象 #python类的语法 关键字 class #class 类名 类名的规范是:数字字母下划线组成,不能以数字开头 首字母大写 驼峰命名 #类属性 放在类里面的变量值 #类方法 放在类里面的 ...