函数的模拟实现

简介: 函数的模拟实现

题一:

模拟实现strncpy

#include <stdio.h>
void my_strncpy(char* arr2, char* arr1, size_t num)
{
  int i = 0;
  for (i = 0; i < num; i++)
  {
    *(arr2 + i) = *(arr1 + i);
  }
}
int main()
{
  char arr1[] = "hello liangzai";
  char arr2[10] = { 0 };
  //strncpy(arr2,arr1,sizeof(arr2));
  my_strncpy(arr2, arr1, sizeof(arr2));
  return 0;
}

优解一:

char * mystrncpy(char * dst, const char * src, size_t n)
{
  int i;
  for (i = 0; src[i] && i < n; i++)
  {
    dst[i] = src[i];
  }
   
  if (i < n)
  {
    dst[i] = 0;
  }
  return dst;
}

题二:

模拟实现strncat

#include <stdio.h>
#include <string.h>
char* my_strncat(char* arr1, const char* arr2, size_t num)
{
  int sz = strlen(arr1);
  int i = 0;
  for (i = 0; i < num; i++)
  {
    *(arr1 + sz + i) = *(arr2 + i);
  }
  return arr1;
}
int main()
{
  char arr2[] = "shawanyi ";
  char arr1[20] = "hello ";
  //strncat(arr1,arr2,10);
  my_strncat(arr1, arr2, 10);
  return 0;
}

优解一:

char * mystrncat(char * dst, const char * src, size_t n)
{
  char * tmp = dst;
   
  while (*dst)
  {
    dst++;//记录到dst最后一个位置
  }
   
  int i;
  for (i = 0; src[i] && i < n; i++)
  {
    dst[i] = src[i];
  }
   
  dst[i] = 0;
  return tmp;
}

题三:

模拟实现atoi

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
int my_atoi(const char* arr1)
{
  assert(arr1);
  int sum = 0;
  if (*(arr1) == '\0')
  {
    return 0;
  }
  while(isspace(*arr1))
  {
    arr1++;
  }
  int flat = 1;
  if (*arr1 == '+')
  {
    arr1++;
  }
  else if (*arr1 == '-')
  {
    flat = -1;
    arr1++;
  }
  int ret = 0;
  while (isdigit(*arr1))
  {
    ret = ret * 10 + (*arr1 - '0');
    if (ret > INT_MAX)
    {
      return INT_MAX * flat;
    }
    else if (ret < INT_MIN)
    {
      return INT_MIN * flat;
    }
    arr1++;
  }
  if (isdigit(*arr1) == 0)
  {
    return ret * flat;
  }
  return ret*flat;
}
int main()
{
  char arr1[] = "-123666a44";
  //int n = atoi(arr1);
  int sz = 0;
  sz = my_atoi(arr1);
  return 0;
}

优解一

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
//VALID 表示结果合法
//INVALID 表示结果非法
enum State
{
 VALID,//0
 INVALID//1
};
//默认结果可能非法,当正确转换后再改为合法
enum State state = INVALID;
int my_atoi(char *str)
{
 int flag = 1;
 long long ret = 0;
 assert(str);
 state = INVALID;
  //跳过空白字符
 while(isspace(*str))
 {
  str++;
 }
 if(*str == '\0')
 {
  return 0;
 }
  //跳过正负号
 if(*str == '+')
 {
  str++;
 }
 else if(*str == '-')
 {
  flag = -1;
  str++;
 }
  //开始转换数字字符直到非数字字符
 while(isdigit(*str))
 {
  ret = ret * 10 + flag * (*str-'0');
  if((ret > INT_MAX) || (ret < INT_MIN))
  {
   return 0;
  }
  str++;
 }
  //正常停止
 if(*str == '\0')
 {
  state = VALID;
  return (int)ret;
 }
 else
 {
    //遇到非数字字符
  return (int)ret;
 }
目录
相关文章
|
12月前
|
传感器 存储 人工智能
用通义灵码2.5打造智能倒计时日历:从零开始的Python开发体验
本文记录了使用通义灵码2.5开发倒计时日历工具的全过程,展现了其智能体模式带来的高效协作体验。从项目构思到功能实现,通义灵码不仅提供了代码生成与补全,还通过自主决策分解需求、优化界面样式,并集成MCP工具扩展功能。其记忆能力让开发流程更连贯,显著提升效率。最终成果具备事件管理、天气预报等功能,界面简洁美观。实践证明,通义灵码正从代码补全工具进化为真正的智能开发伙伴。
|
9月前
|
定位技术 数据处理 API
手把手教你怎么做人口密度热力图
本文介绍了使用Python和ArcGIS绘制人口密度地图的方法。Python部分包括地图数据获取、格式转换、数据整合及可视化;ArcGIS部分涵盖地图投影、数据连接、人口密度计算与图例设置。同时提供了C++代码用于数据分割,并介绍了如何利用高德API获取地址经纬度,实现地图标注。
1453 0
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
1058 1
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
存储 安全 算法
深入探索iOS系统安全机制:保护用户隐私的前沿技术
本文旨在探讨苹果公司在其广受欢迎的iOS操作系统中实施的先进安全措施,这些措施如何共同作用以保护用户的隐私和数据安全。我们将深入了解iOS的安全架构,包括其硬件和软件层面的创新,以及苹果如何通过持续的软件更新来应对新兴的安全威胁。此外,我们还将讨论iOS系统中的一些关键安全功能,如Face ID、加密技术和沙箱环境,以及它们如何帮助防止未经授权的访问和数据泄露。
|
监控 Dubbo Java
|
自动驾驶 算法 新能源
2022深圳杯C题思路解析
2022深圳杯C题思路解析
655 0
2022深圳杯C题思路解析
|
缓存 负载均衡 安全
手把手教你,使用 Nginx 搭配 Tomcat 实现负载均衡!(一)
说到 Nginx ,相信大家都不会陌生,最常用的莫过于:用它来与 Tomcat 搭配做负载均衡,起到灰度发布的作用,同时保证系统高可用!
手把手教你,使用 Nginx 搭配 Tomcat 实现负载均衡!(一)
|
Ubuntu Java Linux
Centos / Ubuntu /linux JAVA 环境变量设置
1.查看 JDK JAVA 是否已安装 风来了.fox java -version 如果有输出信息表示JAVA JDK已安装过了,直接看 4 2.安装JAVA JDK http://blog.csdn.net/fenglailea/article/details/26006647 3.JAVA JDK 安装位置查看 位置查找 which ja
2766 0
|
16天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23519 12
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」