模拟实现strncat、qsort、atoi

目录

前言

一、模拟实现strncat

参数

代码演示:

二、模拟实现qsort

参数

代码演示:


前言

本文主要是对strncat,qsort,atoi的模拟实现


一、模拟实现strncat

      C 库函数 char *strncat(char *dest, const char *src, size_t n) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。

实现起来很容易,但要注意细节

# 关键点
- dest=NULL` 时不能复制**,因为无法写入 `NULL` 指针。
- src=NULL` 时也不能复制**,因为无法读取 `NULL` 指针。
- num=0` 时直接返回 `dest`**,因为不需要追加任何字符。
- 标准库 `strncat` 的行为**:它不检查 `dest` 或 `src` 是否为 `NULL`,直接解引用它们,所以调用者必须确保它们有效。但我们在模拟实现时,可以增加安全检查,避免崩溃。

参数

  • dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
  • src -- 要追加的字符串。
  • n -- 要追加的最大字符数。

代码演示:

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include<windows.h>char* my_strncat(char* dest, const char* src, size_t num) {if ( dest==NULL||src == NULL||num==0) {return dest;}char* a = dest;while (*dest)dest++;while ((*dest++ = *src++) && num--); *dest = '\0';return a;
}int main() {char a[] = "jfskjfsj";char b[] = "shffhs";my_strncat(a, b, 3);puts(a);my_strncat(a ,b, 7);puts(a);char str1[20];char str2[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strncat(str1, str2, 6);puts(str1);system("pause");return 0;
}
#include <stdio.h>
#include <assert.h>char* my_strncat(char* dest, const char* src, size_t num) {if (dest == NULL) {  // 如果 dest 是 NULL,直接返回 NULLreturn NULL;}if (src == NULL || num == 0) {  // 如果 src 是 NULL 或 num=0,直接返回 destreturn dest;}char* a = dest;// 找到 dest 的末尾while (*dest) {dest++;}// 复制最多 num 个字符while (num-- && (*dest++ = *src++)) {// 空循环体}// 确保字符串以 '\0' 结尾*dest = '\0';return a;
}int main() {char a[20] = "hello";char b[] = "world";my_strncat(a, b, 3);  // a 变成 "hellowor"puts(a);// 测试 dest=NULL 的情况char* null_dest = NULL;my_strncat(null_dest, b, 3);  // 不会崩溃,直接返回 NULLputs(null_dest);// 测试 src=NULL 的情况my_strncat(a, NULL, 3);  // 不会崩溃,直接返回 aputs(a);return 0;
}

二、模拟实现qsort

   qsort 是 C 标准库中提供的一个函数,用于对数组进行快速排序。它在 <stdlib.h> 头文件中定义。qsort 使用的是快速排序算法(quicksort),这是一种高效的排序算法,平均时间复杂度为 O(n log n)。

C 库函数 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 对数组进行排序。

参数

  • base: 指向待排序数组的第一个元素的指针。
  • nitems: 数组中的元素数量。
  • size: 数组中每个元素的大小(以字节为单位)。
  • compar: 比较函数的指针,该函数用于比较两个元素。比较函数应当返回一个整数,表示比较结果:
    • 小于零:表示第一个元素小于第二个元素。
    • 等于零:表示两个元素相等。
    • 大于零:表示第一个元素大于第二个元素。

代码演示:

#include <stdio.h>
#include <string.h> // 交换两个元素(逐字节交换)
void swap(void* a, void* b, size_t size) {char* pa = (char*)a;char* pb = (char*)b;for (size_t i = 0; i < size; i++) {char tmp = pa[i];pa[i] = pb[i];pb[i] = tmp;}
}// Hoare 分区法
int partition(void* base, int low, int high, size_t size, int (*compar)(const void*, const void*)) {char* arr = (char*)base;void* pivot = arr + high * size; // 选择最后一个元素作为 pivotint i = low - 1;for (int j = low; j <= high - 1; j++) {if (compar(arr + j * size, pivot) <= 0) {i++;swap(arr + i * size, arr + j * size, size);}}swap(arr + (i + 1) * size, arr + high * size, size);return i + 1;
}// 递归快速排序
void quick_sort(void* base, int low, int high, size_t size, int (*compar)(const void*, const void*)) {if (low < high) {int pi = partition(base, low, high, size, compar);quick_sort(base, low, pi - 1, size, compar);quick_sort(base, pi + 1, high, size, compar);}
}// 模拟 qsort
void my_qsort(void* base, size_t num, size_t size, int (*compar)(const void*, const void*)) {if (base == NULL || num == 0 || size == 0 || compar == NULL) {return; // 无效参数直接返回}quick_sort(base, 0, num - 1, size, compar);
}// 比较函数(整型)
int cmp(const void* a, const void* b) {return *(int*)a - *(int*)b;
}int main() {int arr[] = {88,999,0, 5, 2, 8, 1, 3 };size_t n = sizeof(arr) / sizeof(arr[0]);my_qsort(arr, n, sizeof(int), cmp);for (size_t i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

三、模拟实现atoi

        C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

声明

下面是 atoi() 函数的声明。

int atoi(const char *str)

参数

  • str -- 要转换为整数的字符串。

代码演示:
#include<stdio.h>
#include <ctype.h>
#include <limits.h>
#include<string.h>
int my_atoi(const char* str) {int flag = 1;long result = 0;  // 使用long来检测溢出// 跳过前导空白字符while (isspace(*str))str++;// 处理可选符号if (*str == '+') {str++;}else if (*str == '-') {flag = -1;str++;}// 转换数字部分while (isdigit(*str)) {result = result * 10 + (*str - '0');str++;// 检查溢出if (flag == 1 && result > INT_MAX) {return INT_MAX;}else if (flag == -1 && -result < INT_MIN) {return INT_MIN;}}return (int)(flag * result);
}
int main() {char a[] = "123458899";int ret = my_atoi(a);printf("%d\n ", ret);int val;char str[20] = "98993489";val = my_atoi(str);printf("字符串值 = %s, 整型值 = %d\n", str, val);char str2[20] = "runoob.com";val = my_atoi(str2);printf("字符串值 = %s, 整型值 = %d\n", str2, val);return 0;
}


总结

关于本篇的内容就结束了,对你有帮助的可以点个赞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 系统中修改 MySQL 的 sql_mode

在 Ubuntu 系统中修改 MySQL 的 sql_mode 需要编辑 MySQL 的配置文件并重启服务。以下是详细步骤&#xff1a; 步骤 1&#xff1a;定位 MySQL 配置文件 MySQL 配置文件通常位于以下路径之一&#xff08;具体取决于安装方式&#xff09;&#xff1a; /etc/mysql/my.cnf /etc/m…

进阶算法 第一课:贪心

本文遵循 CC BY-NC-ND 4.0 协议&#xff0c;作者&#xff1a; U•ェ•*U \texttt{U•ェ•*U} U•ェ•*U&#xff0c;转载请获得作者授权。 欢迎大家来到进阶算法第一课&#xff1a;贪心&#xff1b;我会分为以下几点为大家讲解贪心&#xff1a; 什么是贪心。贪心的性质与分类。…

AI领域:MCP 与 A2A 协议的关系

一、为何会出现MCP和A2A 协议是非常重要的东西&#xff0c;只有大家都遵循统一的协议&#xff0c;整体生态才好发展&#xff0c;正如有了HTML&#xff0c;互联网才快速发展&#xff0c;有了OpenAPI&#xff0c; API才会快速发展。 Agent目前是发展最快的领域&#xff0c;从最初…

深度学习训练中的显存溢出问题分析与优化:以UNet图像去噪为例

最近在训练一个基于 Tiny-UNet 的图像去噪模型时&#xff0c;我遇到了经典但棘手的错误&#xff1a; RuntimeError: CUDA out of memory。本文记录了我如何从复现、分析&#xff0c;到逐步优化并成功解决该问题的全过程&#xff0c;希望对深度学习开发者有所借鉴。 训练数据&am…

FramePack V2版 - 支持首尾帧生成,支持LoRA,支持批量,支持50系显卡,一个强大的AI视频生成软件 本地一键整合包下载

FramePack 是斯坦福大学主导开发的视频生成框架&#xff0c;是一种用于视频生成的下一帧&#xff08;下一帧部分&#xff09;预测神经网络结构&#xff0c;可以逐步生成视频。FramePack 主要开发者之一&#xff0c;就是业内大名鼎鼎的张吕敏大佬&#xff0c;AI领域的“赛博佛祖…

STM32 HAL 通用定时器延时函数

使用通用定时器TIM3&#xff0c;实现ms、us延时。 delay.c #include "delay.h" #include "stm32f1xx_hal.h"TIM_HandleTypeDef htim3;/*** brief 初始化定时器3用于延时* param 无* retval 无*/ void Delay_Init(void) {TIM_ClockConfigTypeDef sClock…

软件功能测试和非功能测试有什么区别和联系?

软件测试是保障软件质量的核心环节&#xff0c;而软件功能测试和非功能测试作为测试领域的两大重要组成部分&#xff0c;承担着不同但又相互关联的职责。 软件功能测试指的是通过验证软件系统的各项功能是否按照需求规格说明书来正确实现&#xff0c;确保软件的功能和业务流程…

使用Java调用TensorFlow与PyTorch模型:DJL框架的应用探索

在现代机器学习的应用场景中&#xff0c;Python早已成为广泛使用的语言&#xff0c;尤其是在深度学习框架TensorFlow和PyTorch的开发和应用中。尽管Java在许多企业级应用中占据一席之地&#xff0c;但因为缺乏直接使用深度学习框架的能力&#xff0c;往往使得Java开发者对机器学…

Docker安装beef-xss

新版的kali系统中安装了beef-xss会因为环境问题而无法启动&#xff0c;可以使用Docker来安装beef-xss&#xff0c;节省很多时间。 安装步骤 1.启动kali虚拟机&#xff0c;打开终端&#xff0c;切换到root用户&#xff0c;然后执行下面的命令下载beef的docker镜像 wget https:…

metasploit(2)生成dll木马

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 一、dll文件基本概念 DLL 是一种包含可由多个程序同时使用的代码和数…

5V 1A充电标准的由来与技术演进——从USB诞生到智能手机时代的电力革命

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 一、起源&#xff1a;USB标准与早期电力传输需求 1. USB的诞生背景 1996年&#xff0c;由英特尔、微软、IBM等公司组成的USB-IF&#xff08;USB Implementers Forum&#xff09;发布了…

使用Python设置excel单元格的字体(font值)

一、前言 通过使用Python的openpyxl库&#xff0c;来操作excel单元格&#xff0c;设置单元格的字体&#xff0c;也就是font值。 把学习的过程分享给大家。大佬勿喷&#xff01; 二、程序展示 1、新建excel import openpyxl from openpyxl.styles import Font wb openpyxl.…

【设计模式】深入解析代理模式(委托模式):代理模式思想、静态模式和动态模式定义与区别、静态代理模式代码实现

代理模式 代理模式&#xff0c;也叫委托模式。 Spring AOP 是基于动态代理来实现 AOP 的 定义 为其他对象提供一种代理 以控制对这个对象的访问。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而…

利用java语言,怎样开发和利用各种开源库和内部/自定义框架,实现“提取-转换-加载”(ETL)流程的自动化

一、ETL 架构设计的核心要素​ 在企业级数据处理场景中&#xff0c;ETL&#xff08;Extract-Transform-Load&#xff09;流程自动化是数据仓库、数据湖建设的核心环节。基于 Java 生态的技术栈&#xff0c;我们可以构建分层解耦的 ETL 架构&#xff0c;主要包含以下四层结构&am…

2023蓝帽杯初赛内存取证-8

也是用到pslist模块&#xff0c;加上grep过滤”chrome“即可&#xff1a; vol.py --plugin/opt/volatility/plugins -f memdump.mem --profile Win7SP1x64 pslist | grep "chrome" 第一个是PID&#xff0c;第二个是PPID&#xff0c;第三个是线程数&#xff0c;第四个…

【C语言】动态内存的常见错误

前言&#xff1a; 在上章节中讲解了动态内存的概念和管理的核心函数。 在本章节继续为大家介绍动态内存的常见错误&#xff0c;让大家更好的理解运用。 补充&#xff1a;使用内存函数需要头文件<stdlib.h> 对NULL指针的解引用操作 当使用malloc、calloc或realloc等函…

uniapp-x 二维码生成

支持X&#xff0c;二维码生成&#xff0c;支持微信小程序&#xff0c;android&#xff0c;ios&#xff0c;网页 - DCloud 插件市场 免费的单纯用爱发电的

Linux内核之文件驱动随笔

前言 近期需要实现linux系统文件防护功能&#xff0c;故此调研了些许知识&#xff0c;如何实现文件防护功能从而实现针对文件目录防护功能。当被保护的目录&#xff0c;禁止增删改操作。通过内核层面实现相关功能&#xff0c;另外在通过跟应用层面交互从而实现具体的业务功能。…

利用大模型实现地理领域文档中英文自动化翻译

一、 背景描述 在跨国性企业日常经营过程中&#xff0c;经常会遇到专业性较强的文档翻译的需求&#xff0c;例如法律文书、商务合同、技术文档等&#xff1b;以往遇到此类场景&#xff0c;企业内部往往需要指派专人投入数小时甚至数天来整理和翻译&#xff0c;效率低下&#x…

鸿蒙Flutter仓库停止更新?

停止更新 熟悉 Flutter 鸿蒙开发的小伙伴应该知道&#xff0c;Flutter 3.7.12 鸿蒙化 SDK 已经在开源鸿蒙社区发布快一年了&#xff0c; Flutter 3.22.x 的鸿蒙化适配一直由鸿蒙突击队仓库提供&#xff0c;最近有小伙伴反馈已经 2 个多月没有停止更新了&#xff0c;不少人以为停…