函数的模拟实现

简介: 函数的模拟实现

题一:

模拟实现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;
 }
目录
相关文章
|
7月前
模拟队列训练
模拟队列训练
37 0
|
29天前
|
前端开发 JavaScript
模拟 new 的实现
模拟 `new` 实现是指在 JavaScript 中,通过自定义函数来模拟内置的 `new` 操作符的行为,以便更好地理解其工作原理和对象构造过程。这种方式通常涉及创建一个新对象、绑定原型链、执行构造函数等步骤。
|
7月前
|
C语言
深入理解并模拟实现函数
深入理解并模拟实现函数
|
7月前
函数的模拟实现1
函数的模拟实现1
60 0
|
Python
抽卡程序模拟
抽卡程序模拟
144 0
内存函数的使用和模拟实现
那么今天我要分享的是内存函数,为什么我会给大家分享这个呢?或者说,内存函数的作用是什么呢?有了字符函数就行了,为什么还会有内存函数呢?那么我们就先来看看字符函数和字符串函数的局限性。字符函数和字符串函数,看见这个名字我们应该就可以知道这个函数的操作对象是什么了,没错,字符函数和字符串函数是操作字符和字符串的,但是平常生活中我们遇到的可不止有字符串,所以这时候就出现了内存函数,它的好处是:可以操作任意类型的数据,这样就极大的方便了我们了我们的生活。接下来我们就来看看这些内存函数是如何使用以及自己来模拟实现它。
|
SQL 监控 前端开发
模拟数据在实际场景中的应用
模拟数据在实际场景中的应用
180 0
模拟数据在实际场景中的应用
|
Go
UCF2016-g2g c u l8r(模拟)
UCF2016-g2g c u l8r(模拟)
86 0
new 的模拟实现
new 的模拟实现
75 0