一. strcmp

strcmp是用于比较两个字符串的大小的。

 

int strcmp( const char *string1, const char *string2 )

char *string1 = "abcd";

char *string2 = "abfdhjt";

   就像上面两个字符串,strcmp是从第一个字符开始比较,若是相同,就往后走一个字符,直到找到两个不同的字符或者有一个字符串已经结束,遇到了 '\0' ,若是碰到了两个不同的元素,就比较这两个字符的大小,若是str1>str2,就返回正数,要是str1

 

int my_strcmp(const char *dst,const char *src)

{

const char *d = dst;

const char *s = src;

while(*s != '\0' && *d != '\0')

{

if(*s > *d)

return -1;

else if(*d < *s)

return 1;

else if(*d == *s)

{

d++;

s++;

}

}

if(*s == '\0'&& *d == '\0')

return 0;

else if(*d == '\0')

return -1;

else

return 1;

}

二. strcpy

   strcpy是用来复制字符串的,将源字符串(包括 '\0' )复制到目标字符串中,前提是得保证目标字符串有足够的空间去接收源字符串。

 

char *strcpy( char *strDestination, const char *strSource )

 

char *my_strcpy(char *dst,const char *src)

{

if(dst == NULL || src == NULL)

return NULL;

const char *s = src;

char *d = dst;

while(*s != '\0')

{

*d = *s;

d++;s++;

}

*d = '\0';

return dst;

}

 

三. strstr

char *strstr( const char *string, const char *strCharSet );

1

   strstr是用于查找字符串当中的字串的,在string中查找是否存在strCharSet字串。若存在则返回在string中出现strCharSet的第一个字符的地址,若在string中不存在strCharSet字串,则返回NULL。

 

const char *my_strstr(const char *dst, const char *src)

{

assert(dst);

assert(src);

const char *s = src;

const char *d = dst;

while(*d != '\0')

{

const char *ret;

ret = d;

s = src;

while(*s != '\0' && *s == *d)

{

s++;

d++;

}

if(*s == '\0')

return ret;

d++;

}

return NULL;

}

 

四. strchr

char *strchr( const char *string, int c )

1

   strchr是用来查找字符的,在目标字符串中是否有字符ch出现,若找到则返回第一次出现的地址,若没有找到,则返回NULL。

 

const char *my_strchr(const char *dst, int c)

{

if(NULL == dst)

return NULL;

const char *d = dst;

while(*d != '\0')

{

if(*d == c)

return d;

else

d++;

}

return NULL;

}

 

下面两个就有一点复杂,与string有些不同。他们是对内存进行操作的,以字节为单位进行复制。他们两个在某些情况下是有相同的功能的,但是还是有不一样的地方。memcpy不考虑内存重叠的问题。就像下图②所示,这两个字符串有内存重叠的地方,若是不考虑的话,直接从前往后复制的时候,会将后面还没有复制的地方改变,从而改变了还未进行复制的src串。就会导致拷贝的结果出错,最后得到的不是预期要的。图①的情况就适用于从后向前拷贝,所以在复制拷贝时需要判断是否出现了内存重叠的问题。

 

 

五. memcpy

void *memcpy( void *dest, const void *src, size_t count );

1

   memcpy没有考虑内存重叠的问题,它就是单纯的从前向后拷贝。

 

void *my_memcpy(void *dst, const void *src,size_t size)

{

if(dst == NULL || src == NULL)

return NULL;

char *d =(char *) dst;

char *s =(char *) src;

while(size --)

{

*d++ = *s++;

}

return dst;

}

 

六. memmove

void *memmove( void *dest, const void *src, size_t count )

1

   memmove考虑了内存重叠的问题,进行了判断,若是src大于dst,就从后向前拷贝,若是src小于dst,就从前向后拷贝。

 

void *my_memmove(void *dst,const void *src,size_t size)

{

if(NULL == dst || NULL == src)

return NULL;

char *d = (char *)dst;

const char *s =(char *)src;

int i = 0;

if(d < s)

{

for(; i < (int)size;i++)

{

*d++ = *s++;

}

}

else if(d >= s)

{

for(i = (int)size - 1; i >= 0; i--)

{

*(d + i) = *(s + i);

}

}

return dst;

}

面试15--strcmp,strcpy,memmove实现的更多相关文章

  1. 面试 15:顺时针从外往里打印数字(剑指 Offer 第 20 题)

    面试 15:顺时针从外往里打印数字 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数字.例如输入: {{1,2,3}, {4,5,6}, {7,8,9}} 则依次打印数字为 1.2.3. ...

  2. C 实现strcmp,strcpy,strcat函数

    基于C语言的strcmp,strcpy,strcat函数的实现.C语言是一个程序猿的基础,一定要重视. char* strcat ( char * dst , const char * src ) { ...

  3. 剑指offer 面试15题

    面试15题: 题目:二进制中1的个数 题:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路一: 最佳方法:把一个整数减去1,再和原整数做“与运算”,会把该整数最右边的1变成0 ...

  4. memmove和memcpy 以及strcmp strcpy几个库函数的实现

    memmove和memcpy 1.memmove 函数原型:void *memmove(void *dest, const void *source, size_t count) 返回值说明:返回指向 ...

  5. strcmp strcpy的使用 char类型

    //判断从控制台输入的密码是否正确 BOOL varifyPassWord(char passWord[] , int index) { BOOL result = YES; int count = ...

  6. Java多线程面试15道

    Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是 ...

  7. C语言实现strcat / strlen / strcmp / strcpy

    主要考虑两点: 返回值对使用的便利性. 边界,null的判断. strcat char *m_strcat(char *des, const char *src) { assert((des != N ...

  8. Java面试15|网络

    1.TCP(Transmission Control Protocol)三次握手与四次分手 TCP在不可靠的传输信道上提供了可靠传输的抽象,隐藏了我们的应用程序大部分的复杂性功能:丢包重传,按序传送, ...

  9. c++ strcmp strcpy sprintf

随机推荐

  1. 移相器——K波段有源移相器设计

    博主之前在做一款K波段有源移相器,所用工艺为smic55nmll工艺,完成了几个主要模块的仿真,现对之前的工作做个总结. K波段的频率范围是18G——27GHz,所设计移相器的工作频率范围是19G—— ...

  2. Visual Studio pro key license 2019

    仅供学习交流使用,勿用作其他用途!!!!   Visual Studio 2019 Enterprise BF8Y8-GN2QH-T84XB-QVY3B-RC4DF Visual Studio 201 ...

  3. LOJ2257 SNOI2017 遗失的答案 容斥、高维前缀和

    传送门 数字最小公倍数为\(L\)的充分条件是所有数都是\(L\)的约数,而\(10^8\)内最多约数的数的约数也只有\(768\)个.所以我们先暴力找到所有满足是\(L\)的约数.\(G\)的倍数的 ...

  4. GoF的23种设计模式之创建型模式的特点和分类

    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”.这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成.就像我们去商场购买商品时, ...

  5. group by 对多个字段进行分组

    转载自:https://blog.csdn.net/xx_star1204/article/details/72884983 在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获 ...

  6. PTA 甲级 1139

    https://pintia.cn/problem-sets/994805342720868352/problems/994805344776077312 其实这道题目不难,但是有很多坑点! 首先数据 ...

  7. 记录一次使用NPOI遇到的问题

    在.net 下一般使用NPOI操作Excel相信大家都不陌生,但是本人在操作过程中遇到一个比较奇怪的问题,特写此博客记录与大家分享. 例子是使用Winform,点击按钮时弹出打开文件对话框,然后选择文 ...

  8. 用lambda表达式写分组查询的示例

    需要完成的查询逻辑:查询A表中根据CertificateDelayApplyRecordId 分组,每条记录算8个课时,查询出每个CertificateDelayApplyRecordId已经学习了的 ...

  9. [Windows] - DNS防污染工具Pcap_DNSProxy

    最近试过非常多的DNS防污染工具(包括:dnsforwarder.dnsforwarder.dnscrypt-proxy.SimpleDNSCrypt等),感觉这个Pcap_DNSProxy简单.快捷 ...

  10. Linux环境下:vmware安装Windows报错误-无人参与应答文件包含的产品密钥无效

    最近在安装window server 2012 R2的时候,输入好密钥可以继续安装,但在后面又提示我“无人参与应答文件包含的产品密钥无效.删除无效的密钥或在无人参与应答文件中提供有效的产品密钥继续进行 ...