字符函数和字符串函数的使用及模拟实现(上)(2)

简介: 字符函数和字符串函数的使用及模拟实现


多增加了一个字节个数,即拷贝几个字节,更加有了限制


这样会更多考虑源字符串和目的字符串的空间大小,更加的严谨!!


6.strncat

多增加了一个字节个数,即追加几个字节,更加有了限制


这样会更多考虑源字符串和目的字符串的空间大小,更加的严谨!!

 

7.strncmp

多增加了一个字节个数,即比较几个字节,更加有了限制

这样会更多考虑源字符串和目的字符串的空间大小,更加的严谨!!

二、模拟实现

1.strlen

代码如下(示例):

法一:计数器方式

#include<stdio.h>
#include<assert.h>
int my_strlen(char* p)
{
  assert(str);   //防止str为空指针
  int count = 0;
  while (*p++)
  {
    count++;
  }
  return count;
}
int main()
{
  char arr[] = "abcdef";
  int ret = my_strlen(arr);
  printf("%d", ret);
    return 0;
}

法二:递归,不创建临时变量

#include<stdio.h>
#include<assert.h>
int my_strlen(char *str)
{
  if (*str== '\0')
  {
    return 0;
  }
  else
  {
    return my_strlen(str+1) + 1;
  }
}
int main()
{
  char arr[] = "abcdef";
  int ret = my_strlen(arr);
  printf("%d", ret);
}

法三:指针减指针

#include<stdio.h>
#include<assert.h>
int my_strlen(char* str)
{
  char* p = str;
  while (*p!= '\0')
  {
    p++;
  }
  return p - str;
}
int main()
{
  char arr[] = "abcdef";
  int ret = my_strlen(arr);
  printf("%d", ret);
}

2.strcpy

代码如下(示例):

#include<stdio.h>
#include<assert.h>
char * my_strcpy(char* dest, const char* src)
{
  assert(dest && src);
  char* p = dest;
  while (*dest++ = *src++);
return p;
}
int main()
{
  char arr1[] = "aaaaaaaaa";
  char arr2[] = "bbbbbbbb";
  my_strcpy(arr1,arr2);
  printf("%s", arr1);
}

3.strcat

代码如下(示例):

先找斜杠零,再拷贝.

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest,const char* src)
{
  char* p = dest;
  assert(dest && src);
  while (*dest)
  {
    dest++;
  }
  while (*dest++ = *src++);
  return p;
}
int main()
{
  char arr1[20] = "aaaaaa";
  char arr2[] = "bbbbbbbb";
  my_strcat(arr1,arr2);
  printf("%s", arr1);
  return 0;
}

4.strcmp

代码如下(示例):

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
  assert(str1 && str2);
    //法一
  while (*str1)
  {
    while (*str1 != *str2)
    {
      return *str1 - *str2;
    }
    str1++;
    str2++;
  }
  return 0;
    //法二
    while (*str1 == *str2)
  {
    if (*str1=='\0')
      return 0;
    str1++;
    str2++;
  }
  return *str1 - *str2;
}
int main()
{
  char arr1[] = "abddd";
  char arr2[] = "abc";
  int ret=my_strcmp(arr1,arr2);
  if (ret > 0)
    printf("str1大\n");
  else if (ret < 0)
    printf("str2大\n");
  else
    printf("一样大\n");
  return 0;
}

5.strncat

void my_strncat(char* dest, char* src, int n)
{
  while (*dest)
  {
    dest++;
  }
  while (n--)
  {
    *dest++= *src++;
  }
  *dest = '\0';
}
int main()
{
  char arr1[6] = "aa";
  char arr2[] = "bbbbb";
  my_strncat(arr1, arr2,3);
  printf("%s", arr1);
}

总结

  在使用字符串函数的时候,要注意的是函数的返回值和参数的使用,以及源字符串和目的字符串的空间大小!

      我们下期再见!

目录
相关文章
|
资源调度 Kubernetes 应用服务中间件
Kubernetes Scheduler Framework 扩展: 2. Binpack
# 前言 ## 为什么需要Binpack功能? Kubernetes默认开启的资源调度策略是`LeastRequestedPriority`,消耗的资源最少的节点得分最高,优先被调度。这样的资源选择情况有可能导致较多的资源碎片,如下图所示,两个节点各剩余1GPU的资源,导致申请2GPU的作业无法调度,导致整体资源使用率下降。 如果使用的资源调度策略是Binpack,优先将节点
2207 0
|
缓存 测试技术 调度
PolarDB-X的TPC-H列存执行计划
本文从官方的角度逐条解析PolarDB-X在TPC-H列存执行计划的设计要点。这些要点不仅包含了各项优化的原理,还提供了相关的证明与代码实现,希望帮助读者更深入地理解PolarDB-X的列存优化器。
8377 26
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
API 计算机视觉 Python
Transformers 4.37 中文文档(八)(2)
Transformers 4.37 中文文档(八)
164 2
|
存储 缓存 Shell
【C++杂货铺】一文带你走进哈希:哈希冲突 | 哈希函数 | 闭散列 | 开散列
【C++杂货铺】一文带你走进哈希:哈希冲突 | 哈希函数 | 闭散列 | 开散列
287 0
【C++杂货铺】一文带你走进哈希:哈希冲突 | 哈希函数 | 闭散列 | 开散列
|
人工智能 安全 大数据
自主创新操作系统KeyarchOS的崛起
自主创新操作系统KeyarchOS的崛起
345 0
|
机器学习/深度学习 人工智能 自然语言处理
2022年十大人工智能 (AI) 软件解决方案
IDC 预测,人工智能平台和人工智能应用开发和部署将继续成为人工智能市场增长最快的领域。此列表为组织评估最适合其需求的方法和解决方案提供了一个起点。
2022年十大人工智能 (AI) 软件解决方案
|
监控 jenkins 持续交付
Python3,仅仅2段代码,就实现项目代码自动上传及部署,再也不需要Jenkins了。
Python3,仅仅2段代码,就实现项目代码自动上传及部署,再也不需要Jenkins了。
213 0
Microservices on DC/OS and Container Orchestration on Mesos
Microservices on DC/OS and Container Orchestration on Mesos
Microservices on DC/OS and Container Orchestration on Mesos
带你读《全景揭秘字符编码》之十二:十二、参考资料
带你读《全景揭秘字符编码》之十二:十二、参考资料
159 0

热门文章

最新文章