【C语言题解】用函数来模拟实现strlen()、strcpy()、strcmp()、strcat()

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊


学习了函数后,老师让我们用函数来实现上面这四个字符串函数。

我们首先来了解一下这四个字符串函数:

1.strlen函数

用于获取字符串长度(不包括末尾的空字符'\0')

函数原型:size_t strlen(const char *str);

参数str是一个指向字符串的指针。

返回值:返回字符串的长度(无符号整数)。

strlen函数使用例子,

#include <stdio.h>  
#include <string.h>  int main() {  char str[] = "Hello, World!";  printf("%d\n", strlen(str));  // 输出:13  return 0;  
}

 接下来让我们用函数来实现strlen函数的功能

int Strlen(char ch[])
{int count = 0;while (*ch!='\0')//可以只写成 *ch,当*ch为'\0'时条件为假{count++;ch++;}return count;
}
int main()
{char ch[100];scanf("%99s", ch);//读取最多99个字符以防止缓冲区溢出printf("打印数组ch:\n");printf("%s\n", ch);//模拟调用strlenprintf("数组ch中输入的字符个数为:%d\n", Strlen(ch));return 0;
}

还可以用递归函数来写一下

int DiguiStrlen(char* ch)
{if ('\0' == *ch)return 0;elsereturn 1 + DiguiStrlen(ch + 1);
}

 2.strcpy函数

用于将源字符串中的内容复制到目标字符串中。

函数原型:char *strcpy(char *dest, const char *src);

参数dest是目标字符串的指针,src是源字符串的指针。

返回值:返回目标字符串的指针。

注意:使用strcpy时必须确保目标字符串有足够的空间来存储源字符串,包括末尾的空字符 '\0'。否则,可能会导致缓冲区溢出,这是一个常见的安全漏洞。

strcpy函数使用例子,

#include <stdio.h>  
#include <string.h>  
int main() 
{  char dest[20];  char src[] = "Hello, World!";  strcpy(dest, src);  printf("dest: %s\n", dest);  // 输出:dest: Hello, World!  return 0;  
}

用函数实现strcpy的功能:

void Strcpy(char* a,char* ch)
{int i = 0;for (i; ch[i]!='\0'; i++)a[i] = ch[i];a[i] = '\0';//给字符数组a后添加\0以确保其能够正确终止
}
int main()
{char ch[100];char a[100];scanf("%99s", ch);//读取最多99个字符以防止缓冲区溢出printf("打印数组ch:\n");printf("%s\n", ch);//模拟调用strcpyStrcpy(a, ch);printf("%s\n", a);return 0;
}

注意要在函数中给目标字符数组a的最后添加'\0',我一开始经常忽略这部分,导致每次程序运行打印字符数组a时都打出很多个 烫烫烫 这样的乱码,这是内存中其他部分的随机字节被解释成字符后的结果。 

3. strcmp函数

比较两个字符串中对应位置字符的ASCII码值的大小

函数原型:int strcmp(const char *str1, const char *str2); 

如果str1小于str2,则返回值小于0

如果str1等于str2,则返回值为0

如果str1大于str2,则返回大于0

它是一个字符一个字符地比较,ASCII码值不同就返回结果;如果两个字符完全相同就返回0

strcmp函数使用例子,

#include <stdio.h>  
#include <string.h>  
int main() {  char str1[] = "apple";  char str2[] = "banana";  int r= strcmp(str1, str2);  printf("%d\n", r);  // 输出:-1 return 0;  
}

用函数实现strcmp的功能,

int Strcmp(char ch[],char* b,int len_ch,int len_b)
{int len = 0;//两个字符串长度不同时,先取相同长度if (len_ch > len_b)len = len_b;elselen = len_ch;int i = 0;//比较相同长度部分for (i; i < len; i++){if (ch[i] > b[i])return 1;else if (ch[i] < b[i])return -1;//当前比较字符相同时,continue跳过后面//进入下一次循环比较下一个字符elsecontinue;}if (ch[i] == '\0' && b[i] == '\0')return 0;else if (ch[i] == '\0' && b[i] != '\0')return -1;elsereturn 1;}
int main()
{char ch[100];char b[] = "grape";scanf("%99s", ch);//读取最多99个字符以防止缓冲区溢出printf("打印数组ch:\n");printf("%s\n", ch);//模拟调用strcmpprintf("%d\n", Strcmp(ch,b,Strlen(ch),Strlen(b)));return 0;
}

4. strcat函数

将源字符内容拼接到目标字符末尾。

原型:char *strcat(char *dest, const char *src);

参数dest是目标字符串的指针,src是源字符串的指针。

返回值:返回目标字符串的指针。

注意:使用strcat时必须确保目标字符串有足够的空间来存储追加后的字符串,包括末尾的空字符 '\0'。否则,可能会导致缓冲区溢出

strcat函数使用例子,

#include <stdio.h>  
#include <string.h>    
int main() {  char dest[100] = "Hello, ";  char src[] = "World!";  strcat(dest, src);  printf("%s\n", dest);  // 输出:Hello, World!  return 0;  
}

用函数实现strcat的功能:

void Strcat(char ch[], char b[],int len_ch)
{int i = len_ch;for (i; *b != '\0'; i++){ch[i] = *b;//将字符数组b的内容拼接在字符数组ch后面b++;}ch[i] = '\0';
}
int main()
{char ch[100];char b[] = "grape";scanf("%99s", ch);//读取最多99个字符以防止缓冲区溢出printf("打印数组ch:\n");printf("%s\n", ch);//模拟调用strcatStrcat(ch, b, Strlen(ch));printf("%s\n", ch);return 0;
}

🎉🎉本次的内容结束啦,欢迎有问题评论区讨论。

😘💕希望大家能够三连支持,你们的鼓励是我前进的动力

🌹🌹谢谢观看!

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

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

相关文章

每日OJ题_贪心算法四②_力扣435. 无重叠区间

目录 力扣435. 无重叠区间 解析代码 力扣435. 无重叠区间 435. 无重叠区间 难度 中等 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2]…

机器学习-有监督学习

有监督学习是机器学习的一种主要范式&#xff0c;其基本思想是从有标签的训练数据中学习输入和输出之间的关系&#xff0c;然后利用学习到的模型对新的输入进行预测或分类。 有监督学习的过程如下&#xff1a; 1. 准备数据&#xff1a;首先&#xff0c;需要准备一组有标签的训练…

WPF EventSetter 写法

感觉这玩意之前一直没用过&#xff0c;可能在容器里用到的比较多吧&#xff0c;记录一下。 第一种代码法&#xff1a; Style itemContainerStyle new Style(typeof(ListBoxItem));itemContainerStyle.Setters.Add(new Setter(ListBoxItem.AllowDropProperty, true));itemCont…

IDEA安装使用Git

IDEA安装使用Git 1 Git下载与安装 2 在IDEA中使用Git 2.1 IDEA中配置Git 在IDEA中使用Git&#xff0c;本质上还是使用本地安装的Git软件&#xff0c;所以需要在IDEA中配置Git。 2.2 在IDEA中使用Git 2.2.1 获取Git仓库 在IDEA中使用Git获取仓库有两种方式: 本地初始化仓库从…

CentOS7 安装 Kamailio

https://www.kamailio.org/wiki/packages/rpms 官方文档说 yum -y install yum-utils yum-config-manager --add-repo https://rpm.kamailio.org/centos/kamailio.repo 但目前这样其实行不通 需要这样做&#xff1a; yum install --disablerepokamailio --enablerepokamai…

软件测试面试题学习

参考视频&#xff1a;软件测试面试——接口测试用例该怎么设计_哔哩哔哩_bilibili 1. 接口测试用例该怎么设计&#xff1f; a.功能测试用例的时候针对的是单接口&#xff0c;提交的一个各种正向或逆向的一些测试数据 b.业务测试用例&#xff0c;

Python异步编程之道:asyncio库的探索与应用

Python异步编程之道&#xff1a;asyncio库的探索与应用 一、引言 在Python编程中&#xff0c;异步编程是提高程序性能、处理高并发场景的重要技术。传统的同步编程模型在处理I/O密集型任务时&#xff0c;如网络请求、文件读写等&#xff0c;会导致CPU的空闲等待&#xff0c;从…

数据库出现死锁的解决方法参考

死锁引起的原因一般是多个用户并发访问数据库导致的问题&#xff0c;或是因为某个进程挂死以后资源未释放导致的。通过onstat –p可查看deadlks项大于0即表示历史总计死锁次数。对于被锁的表进行操作的时候会出现-143 ISAM error: deadlock detected的错误。当其他会话访问此表…

从JSON数据到Pandas DataFrame:如何解析出所需字段

目录 一、引言 二、JSON数据的基本结构 三、使用Pandas从JSON数据中读取数据 四、从DataFrame中解析出所需字段 解析对象字段 解析嵌套对象字段 解析数组字段 五、案例与代码示例 六、总结 一、引言 在数据分析和处理的日常工作中&#xff0c;我们经常需要从各种…

UBoat:一款功能强大的HTTP Botnet学习与研究工具

关于UBoat UBoat是一款功能强大的HTTP Botnet概念验证工具&#xff0c;该工具支持复刻一个现实场景中完整功能的Botnet测试环境&#xff0c;广大研究人员可以利用UBoat深入学习和研究Botnet的工作机制&#xff0c;以此来提升安全检测和保护策略。 功能介绍 1、基于C开发&…

luceda ipkiss教程 70:合并GDS版图

通过代码拼版&#xff1a; 所有代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class Design1(i3.GDSCell):def _default_filename(self):return "Ring_Test.gds"def _default_name(self):return "Design1"class Des…

VTK官方例子

VTK官方例子 vtkMutableDirectedGraph #!/usr/bin/env python# noinspection PyUnresolvedReferences import vtkmodules.vtkInteractionStyle # noinspection PyUnresolvedReferences import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkName…

EasyExcel自定义数据格式化

自定格式常量类 public class ExcelFormatConstants {public static final String DATE_FORMAT "yyyy-MM-dd";public static final String NUMBER_FORMAT_DEFAULT "#,##0.00";public static final String NUMBER_FORMAT_FOUR_DECIMAL "#,##0.0000…

Apache Flume事务

Apache Flume 中的事务处理是指 Flume Agent 在处理事件流时的一种机制&#xff0c;用于确保数据的可靠传输和处理。 1. 事务概述&#xff1a; Flume 中的事务是指一组事件的传输和处理&#xff0c;这些事件在传输过程中要么全部成功完成&#xff0c;要么全部失败&#xff0…

Jsp+Servlet实现图片上传和点击放大预览功能(提供Gitee源码)

前言&#xff1a;在最近老项目的开发中&#xff0c;需要做一个图片上传和点击放大的功能&#xff0c;在Vue和SpringBoot框架都有现成封装好的组件和工具类&#xff0c;对于一些上世纪的项目就没这么方便了&#xff0c;所以需要自己用原生的代码去编写&#xff0c;这里分享一下我…

01.Net基础知识

.Net的用途 Web、移动、云、桌面、游戏开发、物联网 &#xff08;IDE&#xff1a;集成开发环境&#xff09; .Net学习资源 Microsoft Learn、GitHub、G码云&#xff08;Gitee&#xff09; Visual Studio初步使用 1&#xff09;可创建的项目种类&#xff08;主要学习以下四…

JSON.parse()反序列化数据丢失

序列化&#xff1a;将数据转换为字符串的过程称为序列化。在序列化过程中&#xff0c;数据结构&#xff08;比如对象、数组等&#xff09;被转换成一个字符串形式&#xff0c;这个字符串通常以特定的格式表示&#xff0c;比如 JSON 或 XML。 反序列化&#xff1a;反序列化是序…

React Native跨平台开发实战:从零到一

最近在学习React Native跨平台开发&#xff0c;从零开始如何开发第一个基础应用并打包发布&#xff1a; 1. 环境准备 安装Node.js安装React Native CLI设置Android或iOS开发环境&#xff08;取决于你想要支持的平台&#xff09; 2. 创建新项目 使用React Native CLI创建一个…

Maven 的仓库、周期和插件

优质博文&#xff1a;IT-BLOG-CN 一、Maven 仓库 在Maven的世界中&#xff0c;任何一个依赖、插件或者项目构建的输出&#xff0c;都可以称为构建。Maven在某个统一的位置存储所有项目的共享的构建&#xff0c;这个统一的位置&#xff0c;我们就称之为仓库。任何的构建都有唯一…

经典权限五张表功能实现

文章目录 用户模块(未使用框架)查询功能实现步骤代码 新增功能实现步骤代码 修改功能实现步骤代码实现 删除功能实现步骤代码实现 用户模块会了&#xff0c;其他两个模块与其类似 用户模块(未使用框架) 查询功能 这里将模糊查询和分页查询写在一起 实现步骤 前端&#xff1…