【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.hqwc.cn/news/704243.html

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

相关文章

【Linux 网络】网络基础(二)(应用层协议:HTTP、HTTPS)-- 详解

我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在应用层。 前面写的套接字接口都是传输层经过对 UDP 和 TCP 数据发送能力的包装&#xff0c;以文件的形式呈现给我们&#xff0c;让我们可以进行应用层编程。换而言之&#xff0c…

测试之路 - 精准而优雅

引子 这几年业内一直在做精准测试&#xff0c;大都使用工具 diff 代码改动、分析代码覆盖率这些平台集成的能力。 业务测试中&#xff0c;我们在技术设计和代码实现的基础上也做了一些精减和精准的测试实践&#xff0c;通过深入测试有针对的设计 case&#xff0c;发现隐藏问题…

RALL-E: Robust Codec Language Modeling with Chain-of-Thought Prompting for TTS

demo pageDetai Xin&#xff0c; tanxu微软 & 东大 & 浙大 abstract 使用CoT的思路&#xff0c;和Valle的框架&#xff0c;先实现LLM预测音素级别pitch/duration&#xff0c;然后预测speech token。 methods Prosody tokens as chain-of-thought prompts 和Valle一…

uac驱动之const修饰的变量和const修饰的指针

const int*p // p所指向的空间是常量 不可修改 ,但p可以修改 int*const p // p所指向的空间是可以修改 ,p不可以修改 #include <stdio.h> #include <string.h>struct usb_string {char id;const char *s; };enum {STR_ASSOC,STR_AC_IF,STR_USB_OUT_IT,STR_USB_O…

20232803 2023-2024-2 《网络攻防实践》实践九报告

目录 1.实践内容2.实践过程2.1 手工修改可执行文件&#xff0c;改变程序执行流程&#xff0c;直接跳转到getShell函数2.2 利用foo函数的Bof漏洞&#xff0c;构造一个攻击输入字符串&#xff0c;覆盖返回地址&#xff0c;触发getShell函数2.3 注入一个自己制作的shellcode并运行…

优秀博士学位论文分享:复杂场景下高精度有向目标检测的研究

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平&#xff0c;本公众号近期将推出“优秀博士学位论文分享”系列文章&#xff0c;对人工智能领域2023年优秀博士学位论文进行介绍和分享&#xff0c;方便广大读者了解人工智能领域最前沿的研究进展。 “博士学位论…

VMware17虚拟机安装Kali Linux2024详解

目录 简介 一、环境搭建 二、下载ISO镜像 三、新建虚拟机 为虚拟机选择合适的操作系统类型和版本 分配适当的内存、硬盘空间和其他虚拟机配置选项 四、硬件配置 编辑虚拟机设置 选择安装介质 五、界面化安装配置 简介 Kali Linux是一个基于Debian的Linux发行版&#…

PopupMenuButton 颜色设置

前言&#xff1a; 今天在使用 flutter PopupMenuItem 的时候想设置它的选中颜色 和 点击颜色的时候&#xff0c;发现并没有相应的属性设置&#xff0c;后才测试才发现是需要 通过 Theme属性 来设置的 正确姿势&#xff1a; 是要通过 Theme 属性来设置&#xff0c;我这只是临时…

基于CentOS-7搭建hadoop3.3.6大数据集群(保姆级教程)

目录 安装虚拟机 为hadoop用户添加权限 关闭防火墙 修改主机名以及ip地址映射 配置ip 连接xshell &#xff0c;以hadoop用户登录 创建目录并将该文件夹权限赋予hadoop用户 安装配置jdk 关闭虚拟机&#xff0c;克隆其他两个节点 修改主机名和ip地址 配置免密登录 安装…

MT3038 植发

思路&#xff1a; 有两个点可以取头发&#xff0c;每个头发寿命不同。 先看点(0,0)&#xff0c;按寿命由小到大排序&#xff08;先考虑寿命短的可以移植到哪里&#xff09;。 (0,0)点头发放置的位置应该让(0,m)点的头发可以尽可能多的放置&#xff08;例如(0,0)点有一根头发…

JavaScript-输入输出语句

输出语句 document.write( 输出的内容 ) 语法&#xff1a;document.write( 输出的内容) 作用&#xff1a;内容会显示在网页上 如果输出的内容是标签&#xff0c;也会被解析为网页元素 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&…

六种恢复已删除PDF文件的方法及实用方法全解析

在数字化时代PDF文件已成为我们日常工作中不可或缺的一部分。有时我们可能会因误操作或系统故障而不小心删除Excel、Word或PPT文档&#xff0c;特别是重要的PDF文件。此时如何高效地恢复这些文件就显得尤为重要。今天将为大家介绍六种恢复已删除PDF文件恢复方法&#xff0c;继续…