函数的模拟实现

题一:

模拟实现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;
 }
相关推荐
白兰地空瓶1 小时前
🚀你以为你在写 React?其实你在“搭一套前端操作系统”
前端·react.js
爱上妖精的尾巴2 小时前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
似水流年QC2 小时前
深入探索 WebHID:Web 标准下的硬件交互实现
前端·交互·webhid
陪我去看海2 小时前
测试 mcp
前端
speedoooo3 小时前
在现有App里嵌入一个AI协作者
前端·ui·小程序·前端框架·web app
fie88893 小时前
NSCT(非下采样轮廓波变换)的分解和重建程序
算法
全栈胖叔叔-瓜州3 小时前
关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。
前端·人工智能
三七吃山漆3 小时前
攻防世界——wife_wife
前端·javascript·web安全·网络安全·ctf
用户47949283569154 小时前
面试官问"try-catch影响性能吗",我用数据打脸
前端·javascript·面试
晨晖24 小时前
单链表逆转,c语言
c语言·数据结构·算法