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

news2025/1/18 20:31:05

🥰欢迎关注 轻松拿捏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);
	//模拟调用strlen
	printf("数组ch中输入的字符个数为:%d\n", Strlen(ch));
	return 0;
}

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

int DiguiStrlen(char* ch)
{
	if ('\0' == *ch)
		return 0;
	else
		return 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);
	//模拟调用strcpy
	Strcpy(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;
	else
		len = 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跳过后面
        //进入下一次循环比较下一个字符
		else
			continue;
	}
	if (ch[i] == '\0' && b[i] == '\0')
		return 0;
	else if (ch[i] == '\0' && b[i] != '\0')
		return -1;
	else
		return 1;

}
int main()
{
	char ch[100];
	char b[] = "grape";
	scanf("%99s", ch);//读取最多99个字符以防止缓冲区溢出
	printf("打印数组ch:\n");
	printf("%s\n", ch);
	//模拟调用strcmp
	printf("%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);
	//模拟调用strcat
	Strcat(ch, b, Strlen(ch));
	printf("%s\n", ch);
	return 0;
}

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

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

🌹🌹谢谢观看!

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

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

相关文章

用Rust构造一个人员基本信息的实体类,输出json测试结果

目录 一、需求说明 二、知识点 serde 一、需求说明 需求描述&#xff1a;用Rust写一个人员基本信息的实体类, 包括编号、姓名、描述、性别、备注、照片、简历等&#xff0c;加上3条测试数据&#xff0c;输出为json。 cargo add serde serde { version "1.0.201"…

SVN切换账号

SVN切换账号 有这么一种情况&#xff0c;对于一个新项目&#xff0c;项目紧急的情况下&#xff0c;大家会使用一个svn账号下载代码&#xff0c;开始提前熟悉业务。那么当正式开发的时候&#xff0c;每个人的svn账号也已经下发下来了&#xff0c;这个时候大家就需要切换成自己的…

Jquery+Servlet+JDBC实现登录注册功能

前端部分 HTMLCSS部分 引入JQuery包和JQuery.cookie包&#xff0c;前者封装了DOM操作的一些方法&#xff0c;后者封装了对cookie的操作 我们使用cookie主要是为了做登录后页面的跳转时&#xff0c;能存下来这个用户是谁&#xff0c;这样后面可以对单一用户进行操作&#xff…

嵌入式学习-PWM输出比较

简介 PWM技术 输出比较框图介绍 定时器部分 比较器控制部分 输出控制部分 相关寄存器

使用screen窗口在Autodl服务器训练网络

无法使用鼠标滚轮来查看历史输出的消息 vim ~/.screenrc 按i插入 termcapinfo xterm* ti:te 按esc :wq 保存screen创建的会话中&#xff0c;无法使用鼠标滚轮来查看历史输出的消息 解决方法_screen查看历史输出-CSDN博客无法使用鼠标滚轮查看screen会话历史&#xff0c;解决方…

证件照尺寸标准大小及用途介绍

在日常生活中&#xff0c;证件照是我们不可或缺的一部分&#xff0c;无论是办理身份证、驾驶证&#xff0c;还是参加考试、求职&#xff0c;都需要用到不同尺寸和底色的证件照。本文将为您详细介绍证件照的尺寸标准、用途以及底色的选择。 一、证件照的尺寸标准证件照的尺寸通…

【错题集-编程题】小红的ABC(字符串 + 找规律)

牛客对应题目链接&#xff1a;小红的ABC (nowcoder.com) 一、分析题目 算法思路&#xff1a;由于题目要找的是最短的回文子串&#xff0c;并且只有三个字母&#xff1a;a、b、c&#xff0c;因此最短的回文子串的长度要么是 2&#xff0c;要么是 3。因此&#xff0c;我们仅需枚举…

如何重启Windows系统上的Mysql服务

很久很久之前&#xff0c;我想把我的一台windows笔记本当比服务使用&#xff0c;当时还没有搞wsl, 试了vmware在局域网内总是断连。然后就直接在 windows系统上装了一个 windows版本的Mysql81。 有一天需要修改最大连接数&#xff0c; 费了挺大的劲终于找到了配置文件 my.ini…

“碳”索不止

2023年&#xff0c;欧盟宣布将在未来实施CBAM&#xff08;碳边境调节机制&#xff09;&#xff0c;也称为碳关税&#xff0c;是一种针对进口货物的碳排放定价政策工具。该机制要求在欧盟境内的进口商对其进口产品支付相应的碳排放费用&#xff0c;以弥补其生产过程中产生的碳排…

K8S认证 | CKA题库 + 答案 | 查看Pod CPU资源使用量

2、查看集群中运行Pod CPU资源使用量 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s …

6.概率论

概率论在深度学习中也有着广泛的应用。由于深度学习模型通常包含大量的参数和复杂的结构&#xff0c;因此在实际应用中很难直接找到最优解。此时&#xff0c;我们可以利用概率论中的相关概念和方法&#xff0c;如贝叶斯推断、最大似然估计等&#xff0c;来估计模型的参数或评估…

【环境监测与分析】-环境检测过程案例

一.方案背景 空气质量检测&#xff0c;是指对空气质量的好坏进行检测。空气质量的好坏反映了空气中污染物浓度的高低。空气污染是一个复杂的现象&#xff0c;在特定时间和地点空气污染物浓度受到许多因素影响。来自固定和流动污染源的人为污染物排放大小是影响空气质量的最主要…

win11安装SQL Server 2012 企业版

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、硬件要求二、软件安装问题参考&#…

国外站群服务器如何提高seo排名

很多seo网站优化会选择国外站群服务器&#xff0c;那么国外站群服务器如何提高seo排名&#xff0c;具体方式有哪些?Rak部落小编为您整理发布国外站群服务器如何提高seo排名。 国外站群服务器可以通过以下几种方式提高网站在搜索引擎中的排名&#xff1a; - **内容分发与加速**…

持续拥抱鲲鹏生态 星辰天合深化信创存储能力

近日&#xff0c;鲲鹏昇腾开发者大会与广电五舟“2024 智算中国行”北京站陆续召开&#xff0c;星辰天合持续拥抱鲲鹏生态&#xff0c;以重要的合作伙伴身份受邀参加&#xff0c;并在鲲鹏昇腾开发者大会上荣获“甄选解决方案最佳应用软件奖”&#xff0c;在广电五舟“2024 智算…

USB2.0协议解读

一、说明 本文以Universal Serial Bus Specification Revision 2.0 April 27, 2000内容为准。 USB2.0支持三种速率&#xff0c;High speed&#xff08;480Mb/s500ppm&#xff09;、Full speed&#xff08;12Mb/s2500ppm&#xff09;以及Low speed&#xff08;1.5Mb/s1.5%&…

JUnit5测试用例

1.用Test注解表示为测试方法 2.使用DisplayName定义别名 3.使用Assertions类的断言方法 使用断言&#xff0c;可以判断方法的实际执行结果和预期结果是否一致 assertEqualsassertTureassertNotNullassertAllassertThrows 下图是预期与实际不同时报错图 4.使用BeforeEach注解&…

分析人工智能在智慧银行服务中的实际应用以及面临的挑战

一、引言 近年来,人工智能(AI)技术快速发展,其在金融领域,特别是智慧银行服务中的应用日益广泛。人工智能以其独特的数据处理能力、预测分析能力以及自动化决策能力,极大地提升了智慧银行的服务效率、降低了运营成本,并优化了客户体验。然而,人工智能在智慧银行服务中…

RocketMQ-Dashboard 控制台使用详解

1 安装部署 具体部署启动请参考&#xff1a;RocketMQ从安装、压测到运维一站式文档_rocketmq benchmark压测-CSDN博客 RocketMq的dashboard&#xff0c;有运维页面&#xff0c;驾驶舱&#xff0c;集群页面&#xff0c;主题页面&#xff0c;消费者页面&#xff0c;生产者页面&…

FileLink如何实现金融行业跨网文件传输

在金融行业&#xff0c;跨网文件传输一直是一个备受关注的问题。由于金融数据的敏感性和重要性&#xff0c;如何确保文件在传输过程中的安全性、稳定性和合规性成为了金融机构急需解决的难题。而FileLink作为一款跨网文件交换系统&#xff0c;凭借其强大的功能和优势&#xff0…