字符函数和字符串函数详解(二)

简介: 字符函数和字符串函数详解

strcmp函数


int strcmp ( const char * str1, const char * str2 );


1.第一个字符串大于第二个字符串,则返回大于0的数字

2.第一个字符串等于第二个字符串,则返回0

3.第一个字符串小于第二个字符串,则返回小于0的数字


如何判断两个字符串呢?

假设有如下两个字符串:


char* m = "abcdef";
  char* n = "abce";
  strcmp(m, n);


首先是两个字符串的第一个字符比较,很明显相等,再比较下一个字符,直到字符 ‘d’ 与 ‘e’ 比较,字符 ‘d’ 是小于 ‘e’ 的,所以m指向的字符串小于n指向的字符串。


#include<stdio.h>
#include<string.h>
int main()
{
  char* m = "abcdef";
  char* n = "abce";
  printf("%d", strcmp(m, n));
  return 0;
}


输出:-1


模拟实现

#include<stdio.h>
int m_strcmp(const char* str1, const char* str2)
{
  while (*str1 == *str2)
  {
  if (*str1 == '\0')
    return 0;
  str1++;
  str2++;
  }
  if (*str1 > *str2)
  return 1;
  if (*str1 < *str2)
  return -1;
}
int main()
{
  char* m = "abcdef";
  char* n = "abca";
  printf("%d", m_strcmp(m, n));
  return 0;
}


输出:1


strncmp函数


int strncmp ( const char * str1, const char * str2, size_t num );


比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。


有兴趣可以自己实现一下。


strstr函数


char * strstr ( const char *str1, const char * str2);


1.返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针。

2.匹配过程不包括终止空字符,但它在那里停止。


int main()
{
  char* m = "abcdef";
  char* n = "cde";
  printf("%s", strstr(m, n));
  return 0;
}


输出:cdef


模拟实现

char * strstr ( const char *str1, const char * str2);


char* m_strstr(const char* str1, const char* str2)
{
  const char* s1 = str1;       //见下图,s1 标记目标字符串每次开始查找的首元素
  const char* s2 = str2;       // s2 标记源字符串每次开始查找的首元素
  const char* p = str1;       // p 标记每次从 s1 开始遍历的元素
  if (*str2 == '\0')
  {
  return str1;
  }
  while (*p)
  {
  s1 = p;
  s2 = str2;        //每次循环开始将 s1 移到后一个元素处,s2 移到首元素处
  while (*s1 != '\0' && *s2 != '\0' && (*s1 == *s2))
  {
    s1++;
    s2++;
  }
  if (*s2 == '\0')      //当源字符串遍历完了后即找到了
  {
    return (char*)p;   
  }
  p++;
  }
  return NULL;   //找不到子串
}
int main()
{
  char* m = "abcdef";
  char* n = "cde";
  printf("%s", m_strstr(m, n));
  return 0;
}


f286e7c3ddd945d3a9da6b644950d3c5.png


当第一次没找到后,第二次循环 s1 、p指向如图:


49643f88016145c796b5c34038460b1b.png


若 p 指向 ‘\0’ ,则表示找不到该字符串,退出循环。


memcpy函数


void * memcpy ( void * destination, const void * source, size_t num );


1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

2.这个函数在遇到 ‘\0’ 的时候并不会停下来。

3.如果source和destination有任何的重叠,复制的结果都是未定义的。


int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int arr2[10] = { 0 };
  memcpy(arr2, arr, 20);
  return 0;
}


我们来看看内存分配情况:


6f86534c35644cebba94e77c4693d3ff.png


由图可以看出memcpy函数改变了20字节的内容,也就是5个整型,改变了5个整型数,那么它是什么方式改变这20字节的呢?

a1e9cb1575454cd28881262b84505758.png


从左到右一个字节一个字节的依次复制,直到20个字节。


模拟实现

void* m_memcpy(void* destination, const void* source, size_t num)
{
  void* p = destination;
  while (num--)      //循环num次
  {
  *(char*)destination = *(char*)source;   //char型访问一个字节,方便逐个字节打印
  destination = (char*)destination + 1;
  source = (char*)source + 1;
  }
  return p;
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int arr2[10] = { 0 };
  m_memcpy(arr2, arr, 20);
  return 0;
}

相关文章
|
存储 JavaScript
【开源图床】使用Typora+PicGo+Gitee搭建个人博客图床
【开源图床】使用Typora+PicGo+Gitee搭建个人博客图床
221 2
|
数据可视化 数据挖掘
【因果推断】Day01- 实用计量方法图解与概述
【因果推断】Day01- 实用计量方法图解与概述
461 2
|
资源调度 Kubernetes 应用服务中间件
Kubernetes Scheduler Framework 扩展: 2. Binpack
# 前言 ## 为什么需要Binpack功能? Kubernetes默认开启的资源调度策略是`LeastRequestedPriority`,消耗的资源最少的节点得分最高,优先被调度。这样的资源选择情况有可能导致较多的资源碎片,如下图所示,两个节点各剩余1GPU的资源,导致申请2GPU的作业无法调度,导致整体资源使用率下降。 如果使用的资源调度策略是Binpack,优先将节点
2079 0
|
12月前
|
弹性计算 网络安全
阿里云国际OpenAPI多接口快速管理ECS服务器教程
阿里云国际OpenAPI多接口快速管理ECS服务器教程
|
传感器 网络协议 Ubuntu
MQTT协议与EMQ
MQTT协议与EMQ
356 0
|
12月前
|
SQL 开发框架 .NET
ASP连接SQL数据库:从基础到实践
随着互联网技术的快速发展,数据库与应用程序之间的连接成为了软件开发中的一项关键技术。ASP(ActiveServerPages)是一种在服务器端执行的脚本环境,它能够生成动态的网页内容。而SQL数据库则是一种关系型数据库管理系统,广泛应用于各类网站和应用程序的数据存储和管理。本文将详细介绍如何使用A
222 3
|
前端开发
umi webpack配置图片资源转base64
umi webpack配置图片资源转base64
|
JavaScript Serverless 网络架构
Next.js与SSR:构建高性能服务器渲染应用
创建Next.js项目使用`create-next-app`,每个页面自动支持SSR。动态路由如`pages/posts/[id]`,在`getStaticPaths`和`getServerSideProps`中获取数据。利用静态优化和预渲染提升性能,动态导入减少初始加载时间。使用`next/image`优化图片,自定义服务器增加控制,集成第三方库如Redux。优化SEO,利用i18n支持多语言,使用Serverless模式和Web Workers。项目支持TypeScript,创建`_error.js`处理错误,部署到Vercel并使用工具进行性能监控和优化。
390 4
|
前端开发
【Web 前端】对于数组去重都有哪些方法?
【4月更文挑战第22天】【Web 前端】对于数组去重都有哪些方法?