C语言中的字符串操作函数自定义实现:标准版与限定长度版

       

目录

1. 标准字符串操作函数自定义实现

(a) 自定义strcpy函数

(b) 自定义strcat函数

(c) 自定义strcmp函数

2. 限定长度字符串操作函数自定义实现

(a) 自定义strncpy函数

(b) 自定义strncat函数

(c) 自定义strncmp函数


 对字符串的操作是不可或缺的一部分。标准库提供了如strcpy、strcat、strcmp等基础字符串处理函数,以及它们的“限定长度”版本strncpy、strncat和strncmp。为了深入理解这些函数的工作原理,我们首先将分别展示其标准版自定义实现,然后探讨它们的限定长度版本。

1. 标准字符串操作函数自定义实现


(a) 自定义strcpy函数

char* my_strcpy(char *dest, const char *src) {assert(dest != NULL);assert(src != NULL);char* set = dest;while (*dest++ = *src++);return set;
}

my_strcpy函数负责完整地将源字符串src复制到目标字符串dest中,并确保包含结束符\0


(b) 自定义strcat函数

void my_strcat(char *dest, const char *src) {char* set = dest;while (*dest != '\0') {dest++;}while ((*dest++ = *src++) != '\0');return set;
}

my_strcat函数将源字符串src追加到目标字符串dest的末尾,同样确保结果字符串以\0结束。


(c) 自定义strcmp函数

int my_strcmp(char* dest, char* src) {while (*dest == *src) {if (*dest == '\0') {return 0;}dest++;src++;}return (*dest > *src) - (*dest < *src);
}

my_strcmp用于比较两个字符串的内容,根据字典顺序返回整数值:相等则为0,dest大于src时为正数,反之为负数。


2. 限定长度字符串操作函数自定义实现


(a) 自定义strncpy函数

void my_strncpy(char *dest, char* src, int count) {assert(*dest && *src);char* set = dest;while (count-- && (*dest++ = *src++));if (count >= 0) {*dest = '\0';}return dest;
}

my_strncpy函数仅复制源字符串src最多count个字符到目标字符串dest中,如果src的字符数量小于count,则剩余空间填充'\0'。


(b) 自定义strncat函数

void my_strncat(char* dest, char* src, int count) {assert(*dest && *src);char* set = dest;while (*dest != '\0') {dest++;}while (count-- && (*dest++ = *src++));if (count >= 0) {*dest = '\0';}return set;
}

my_strncat函数将源字符串src最多count个字符追加到目标字符串dest末尾,并确保结果字符串以'\0'结束。


(c) 自定义strncmp函数

int my_strncmp(const char* dest, const char* src, int count) {assert(dest && src);int i = 0;while (i < count && *dest == *src && *dest != '\0') {i++;dest++;src++;}if (i == count || *dest == '\0' || *src == '\0') {return 0;}else {return *dest - *src;}
}

my_strncmp函数比较两个字符串的前count个字符,当达到指定字符数或遇到任一字符串的结束符时停止比较,并返回相应的字符差值。

        在主函数(main)中,通过实际调用这些自定义函数并对比C标准库函数,我们可以验证它们的功能正确性,并进一步掌握字符串操作函数的底层逻辑。

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

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

相关文章

[bat]0基础实现自动化办公-基于start实现一键打开常用软件/文档

一、应用背景 每次开机时&#xff0c;都要一个个打开常用软件&#xff0c;比如微信、QQ或是word文档、excel表格等程序&#xff0c;比较费时。 二、方案 使用bat脚本中的start方法&#xff0c;通过将需要打开的程序或文件写入到bat脚本中&#xff0c;运行bat脚本从而实现一键…

关于前端面试中forEach方法的灵魂7问?

目录 前言 一、forEach方法支持处理异步函数吗&#xff1f; 二、forEach方法在循环过程中能中断吗&#xff1f; 三、forEach 在删除自己的元素后能重置索引吗&#xff1f; 四、forEach 的性能相比for循环哪个好&#xff1f; 五、使用 forEach 会不会改变原来的数组&#…

我用 ChatGPT 做了一次探索性数据分析,真的太太太实用了!

ChatGPT 经过短短1年时间的发展&#xff0c;其功能越来越强&#xff0c;现在已经是大多数企业和个人不可或缺的助手。特别是最新的 GPT-4 版本&#xff0c;专门在左边菜单栏给出了两个工具&#xff08;一个是数据分析&#xff0c;另一个是根据文字描述生成图片&#xff09;&…

Mysql:重点且常用的 SQL 标签整理

目录 1 <resultMap> 标签 2 <sql> 标签 3 <where> 标签 4 <if> 标签 5 <trim> 标签 6 <foreach> 标签 7 <set> 标签 1 <resultMap> 标签 比如以下代码&#xff1a; <resultMap type"SysCollege" id&qu…

【汇编】pushf popf

两个指令的作用分别是将16位标志寄存器压入栈、从栈中取出&#xff0c;但是貌似没人做实验验证。 这里做个实验加深理解&#xff0c;顺便总结下几个标志寄存器的作用。 一、结构 8086CPU的flag寄存器的结构如下&#xff1a; OF&#xff1a;判断运算结果是否溢出 CF&#xff1…

MySQL 删除ibdata1时怎么恢复

标题&#xff1a;MySQL InnoDB数据恢复&#xff0c;丢失ibdata1时怎么安全恢复 废话在前&#xff1a; 恭喜你&#xff0c;当你看到这篇文章的时候&#xff0c;说明有可能 你心里已经有一万匹&#x1f40e;在奔腾了。千万不要乱删除ibdata1&#xff0c;有些博客无脑抓取、复制…

20240115在ubuntu20.04.6下给GTX1080M显卡安装驱动程序和CUDA

20240115在ubuntu20.04.6下给GTX1080M显卡安装驱动程序和CUDA 2024/1/15 18:05 百度搜索&#xff1a;ubuntu gtx1080m cuda https://blog.csdn.net/wb4916/article/details/129462103 20230311给Ubuntu18.04下的GTX1080M安装驱动 https://www.cnblogs.com/djiankuo/p/5886605.h…

Python爬虫学习笔记(一)---Python入门

一、pycharm的安装及使用二、python的基础使用1、字符串连接2、单双引号转义3、换行4、三引号跨行字符串5、命名规则6、注释7、 优先级not>and>or8、列表&#xff08;list&#xff09;9、字典&#xff08;dictionary&#xff09;10、元组&#xff08;tuple&#xff09;11…

机器人导纳控制实现框架

Safe, Stable and Intuitive Control for Physical Human-Robot Interaction - 知乎关于文章《Safe, Stable and Intuitive Control for Physical Human-Robot Interactio》的简记。 Safe, Stable and Intuitive Control for Physical Human-Robot Interaction目的根据力导数作…

LLVM 环境配置

这里选择下载源码, 然后编译的安装方式。 下载地址 (在这里可以找到多版本, 多平台的LLVM下载资源) # 解压源码 sudo tar xvf llvm-project-17.0.6.src.tar.xz # 新建安装目录 sudo mkdir -p /usr/local/llvm # 新建编译目录 sudo mkdir -p llvm-project-17.0.6.src/build #…

c++学习笔记-STL案例-机房预约系统5-学生模块

前言 衔接上一篇“c学习笔记-STL案例-机房预约系统4-管理员模块”&#xff0c;本文主要设计学生模块&#xff0c;从学生登录和注销、申请预约、显示预约、取消预约四个功能进行分析和实现。 目录 8 学生模块 8.1 学生登录和注销 8.1.1 构造函数 8.1.2 学生子菜单 8.1.3 菜…

gitlab 部署项目新分支

公司代码管理平台新切换到gitlab下&#xff0c;上线发版流程随之变更 1新建分支&#xff0c;开发完成&#xff0c;提交新分支 2.去gitlab平台上找到Merge requests 3 点击右上角的New merge request select source branch 选择新建的分支 点击 compare branches and contin…