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

news2024/12/26 13:42:52

🥰欢迎关注 轻松拿捏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/1665654.html

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

相关文章

Excel 分组汇总后删除明细

有 Excel 数据如下所示&#xff1a; IDCriteria1Criteria2Criteria3Criteria4101210271239312381236123171826182918239182120182147 需要按 ID 分组汇总其余列&#xff0c;结果如下&#xff1a; IDCriteria1Criteria2Criteria3Criteria410121027123932561826939267 解法及简…

直播预告-如何快乐学习亚马逊云科技AWS,玩游戏备考亚马逊云科技云从业者认证?

一边玩一边学习亚马逊云科技云技能&#xff0c;这么好的事尊的假的&#xff1f;本周六&#xff08;5约11日&#xff09;晚20点&#xff0c;亚马逊云科技UG云端夜话Night Talk活动精彩回归&#xff5e; 本次亚马逊云科技UG云端夜话直播是什么&#xff1f; 小李哥这次将在多平台…

2024版本idea集成SpringBoot + Ai 手写一个chatgpt 【推荐】

题目&#xff1a;SpringBoot OpenAi 在这里获取key和url&#xff1a;获取免费key base-url为这两个&#xff1a; 话不多说直接来&#xff01; 一、简介 Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则&#xff08;如可移植性和模块化设计&#xff…

音视频--AAC编码解析和示例

目录 1&#xff1a;AAC编码介绍 2&#xff1a;AAC格式介绍 3&#xff1a;AAC -ADTS帧组成 4&#xff1a;AAC-ADTS&#xff1a;&#xff08;adts_fixed_header&#xff09;格式介绍 5&#xff1a;AAC-ADTS&#xff1a;&#xff08;adts_variable_header&#xff09;格式介绍…

Rust编程语言的特点及其适合做什么

Rust编程语言的特点 Rust是一门系统级编程语言&#xff0c;它有如下特点。 1. 类C的语言语法 Rust的具体语法和C/C类似&#xff0c;都是由花括号限定代码块&#xff0c;还有一样的控制流关键字&#xff0c;例如if、else、while和for。然而&#xff0c;也并非所有的C或者C关键…

初识sql注入--手工注入

目录 可能使用的sql函数 入侵网站方式 1、文件上传漏洞 2、rce 3、sql注入 SQL注入 什么是sql注入 进行SQL注入 实验环境 开始实验&#xff08;使用information_shema数据库&#xff09; 1、进入靶场 2、报列数 下面来解释一下为什么要照上面SQL语句写 url编码 单…

C#标签设计打印软件开发

1、新建自定义C#控件项目Custom using System; using System.Collections.Generic; using System.Text;namespace CustomControls {public class CommonSettings{/// <summary>/// 把像素换算成毫米/// </summary>/// <param name"Pixel">多少像素…

图论(洛谷刷题)

目录 前言&#xff1a; 题单&#xff1a; P3386 【模板】二分图最大匹配 P1525 [NOIP2010 提高组] 关押罪犯 P3385 【模板】负环 P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; SPFA写法 Dij写法&#xff1a; P3385 【模板】负环 P5960 【模板】差分约束…

python的import导入规则

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pycharm只能看到当前工作路径父目录下所有文件和项目根目录下所有文件二、sys或者图形界面添加解释器路径&#xff08;搜寻路径&#xff09;三、import导入…

【ubuntu】ubuntu-18.04开机卡在Starting User Manager for UID 120....问题解决方案

错误截图 解决方案 启动系统&#xff0c;开机界面单击按键esc键&#xff0c;注意需要将鼠标定位到菜单界面&#xff0c;移动键盘上下键选择Advanced options for Ubuntu 进入如下菜单&#xff0c;选择recovery mode 回车之后会弹出如下界面&#xff0c;选择如下root&#xff0…

matlab使用教程(69)—创建包含多个 x 轴和 y 轴的图

此示例说明如何创建这样一张图&#xff0c;通过坐标区底部和左侧的轴放置第一个绘图&#xff0c;并通过坐标区顶部和右侧的轴放置第二个绘图。 使用 line 函数绘制一个红色线条。将 x 轴和 y 轴的轴线颜色设置为红色。 注意&#xff1a;从 R2014b 开始&#xff0c;您可以使用圆…

最大子序列的分数

题目链接 最大子序列的分数 题目描述 注意点 n nums1.length nums2.length从nums1和nums2中选一个长度为k的子序列对应的下标对nums1中下标对应元素求和&#xff0c;乘以nums2中下标对应元素的最小值得到子序列的分数0 < nums1[i], nums2[j] < 1000001 < k < …

精密机械设备运用弧形导轨中如何保持高精度?

导轨精度标准是对导轨的精度统一规定&#xff0c;无论是滑移运动、滑块运动还是旋转运动&#xff0c;都有一定的精度规格。而导轨精度标准是为了保证导轨运动时的精确度而设定的精度标准&#xff0c;它是规定各种导轨的精度统一标准&#xff0c;是机械设备的运动精度基础和保障…

SpringAI 技术解析

1. 发展历史 SpringAI 的发展历史可以追溯到对 Spring 框架的扩展和改进&#xff0c;以支持人工智能相关的功能。随着人工智能技术的快速发展&#xff0c;SpringAI 逐渐成为 Spring 生态系统中的一个重要组成部分&#xff0c;为开发者提供了便捷、灵活的解决方案。 项目的灵感来…

声明变量的六种方法

ES6 声明变量的六种方法 varfunctionletconstclassimport 顶层对象的属性 1. ES6 声明变量的六种方法 ES5 只有两种声明变量的方法&#xff1a; var 命令和 function 命令。 ES6 除了添加 let 和 const 命令&#xff0c;还有另外两种声明变量的方法&#xff1a; import 命令和…

[AutoSar]BSW_Diagnostic_002 DCM模块介绍

目录 关键词平台说明背景一、DCM所处架构位置二、DCM 与其他模块的交互三、DCM 的功能四、DCM的内部子模块4.1 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagnostic 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&…

Realsense-Realman手眼标定

硬件设备 Realsense D405 Realman 65b 软件环境搭建 软件环境依赖&#xff1a; librealsensehttps://github.com/IntelRealSense/librealsense.git ROS1.0ros-noetic-arucosudo apt-get install ros-noetic-aruco*realsense_roshttps://github.com/IntelRealSense/realsens…

萤火虫优化算法(Firefly Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 萤火虫优化算法&#xff0c;是由剑桥大学的Xin-She Yang在2009年提出的一种基于群体智能的优化算法。它的灵感来源于萤火虫在夜晚闪烁…

Python | Leetcode Python题解之第83题删除排序链表中的重复元素

题目&#xff1a; 题解&#xff1a; class Solution:def deleteDuplicates(self, head: ListNode) -> ListNode:if not head:return headcur headwhile cur.next:if cur.val cur.next.val:cur.next cur.next.nextelse:cur cur.nextreturn head

PDF文件恢复:四种实用方法全解析

如何恢复已删除的PDF文件&#xff1f; PDF是Portable Document Format&#xff08;便携式文档格式&#xff09;的缩写&#xff0c;是一种由Adobe Systems开发的文件格式。PDF文件可以包含文本、图形、链接、多媒体以及其他各种元素&#xff0c;并且能够在各种操作系统和设备上…