函数的模拟实现

题一:

模拟实现strncpy

cpp 复制代码
#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;

}

优解一:

cpp 复制代码
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

cpp 复制代码
#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;

}

优解一:

cpp 复制代码
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

cpp 复制代码
#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;

}

优解一

cpp 复制代码
#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;
 }
相关推荐
#麻辣小龙虾#23 分钟前
基于vue3.0开发一款【固废与废气运维管理系统】(支持源码)
前端·vue.js·vue3
坚果派·白晓明28 分钟前
【鸿蒙PC】SDL3 移植:AtomCode Skills 4 步速通多媒体库适配
c++·华为·ai编程·harmonyos·atomcode·c/c++三方库
Cosolar28 分钟前
Docsify零构建文档站完全指南:从快速搭建到企业级部署
前端·开源·github
手写码匠39 分钟前
手写 GraphRAG:从零实现图增强检索增强生成系统
人工智能·深度学习·算法·aigc
weixin_4713830341 分钟前
Taro-02-页面路由
前端·taro
BomanGe144 分钟前
NSK重载高刚性滚珠丝杠技术详解
经验分享·算法·规格说明书
星栈独行1 小时前
Makepad 应用如何读文件、调接口、保存数据
前端·程序人生·ui·rust·github
赴生-1 小时前
C++进阶 C++11(下)
开发语言·c++
有点。1 小时前
C++(贪心算法一)
c++·贪心算法
IT_陈寒2 小时前
Vite热更新失效?可能你在用Windows
前端·人工智能·后端