C语言进阶——字符函数和字符串函数(上)

news2024/12/27 13:45:02

目录

一、前言

二、正文 

        1.求字符串长度

                ♥strlen

         2.长度不受限制的字符串函数

                ♥strcpy

                ♥strcat

                ♥strcmp

   三、结语


一、前言

        一日不见,如隔三秋;几日不见,甚是想念。猜想小伙伴们在平常进行有关字符的练习时遇到有关字符的操作却无从下手,不知道该使用哪些函数来实现相应操作,虽然有些厉害的小伙伴还会写出自定义函数来实现想要的功能。为了提高小伙伴们的功底,麦麦就为大家带来库函数中常见的字符函数和字符串函数,有些函数还会进行模拟实现,供小伙伴们食用。话不多说,让我们进入正文吧!                 ​​​​​

二、正文 

        1.求字符串长度

                ♥strlen

                        ①函数介绍

size_t strlen(const char * str);

●字符串以’\0‘作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')

●参数指向的字符串必须要以’\0‘结束

●注意函数的返回值为size_t,是无符号的(易错)

●所引用的头文件“string.h”

//示例代码,帮助大家理解strlen函数的使用
#include <stdio.h>
#include <string.h>
int main()
{
    const char*str1="my friends";
    const char*str2="welcome to my blog";
    if(strlen(str2)-strlen(str1)>0)
    {
        printf("str2>str1\n");
    }
    else if(strlen(str2)-strlen(str1)==0)
    {
        printf("str2=str1\n");
    }
    else
    {
        printf("str2<str1\n");
    }
    return 0;
}


                 ②模拟实现

        在介绍完strlen函数的使用和功能后,接下来让我们来模拟实现strlen。下面为小伙伴们带来三种strlen函数的模拟实现。

        ①循环实现:strlen函数是计算到'\0'为止,于是我们就可以采取循环的方式,指针每移动一次,我们就让计数+1,知道指针指向’\0‘为止

        ②递归实现:我们发现循环实现的每一步都是一样的,那么是否可以采取递归的形式呢,答案是可以的。求"hello"的长度,就要求“ello”的长度;要求“ello”的长度,就要求“llo”的长度,这样就形成了一种递归的形式。

        ③指针实现:在指针那一节中我们学到了指针-指针求出的是两个指针间隔的大小。那么我们就可以用字符串末尾的'\0'的地址减去字符串首元素的地址就可以求出字符串的长度了。

        具体代码如下:

        

#include <stdio.h>
#include <assert.h>
//strlen三种模拟实现,以下代码仅供参考

size_t my_strlen_1(const char* str)
{
    assert(str != NULL);
	size_t i = 0;
	while (*str++)
	{
		i++;
	}
	return i;
}

size_t my_strlen_2(const char* str)
{
    assert(str != NULL);
	if (*str == '\0')
		return 0;
	else
		return(1 + my_strlen_2(str + 1));
}
size_t my_strlen_3(const char* str)
{
    assert(str != NULL);
	char* tmp = str;
	while (*str)
	{
		str++;
	}
	return(str - tmp);
}

int main()
{
	const char* str = "hello";
	printf("%u\n", my_strlen_1(str)); //循环实现
	printf("%u\n", my_strlen_2(str)); //递归实现
	printf("%u\n", my_strlen_3(str)); //指针实现
	return 0;
}

         2.长度不受限制的字符串函数

                ♥strcpy

                        ①函数介绍

char* strcpy(char * destination, const char * source ) ;                          

 ●功能:将源(source)字符串拷贝到目标空间中

●源字符串必须以'\0'结束

●会将源字符串中的'\0'拷贝到目标空间

●目标空间必须足够大,以确保能存放源字符串

●目标空间必须可变

●所引用的头文件:string.h

//strcmp使用示例
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "";
	char arr2[] = "Happy new year!";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

                        ②模拟实现

        同样的,在小伙伴们了解完strcmp的功能和基本使用后,我们来进行strcmp的模拟实现。这个实现的逻辑是很清晰的,只需要将源字符串搬运到目标空间即可,因此我们可以采用指针以及循环的方式来实现这个功能,

        具体代码如下:

        

//strcmp 模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>

void my_strcpy(char* dest, const char* sorc)
{
	assert(dest && sorc);
	while (*dest++ = *sorc++)
	{
		;
	}

}

int main()
{
	char arr1[20] = "";
	char arr2[] = "Happy new year!";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

                ♥strcat

                        ①函数介绍

char * strcat (char * destination , const char * source );

●功能:在目标空间后面追加源字符串

●源字符串必须以'\0'结尾

●目标空间必须足够大,能够容纳下源字符串的内容

●字符串不可以给自己追加

●引用的头文件:string.h

//strcat代码示例
#include <string.h>
#include <stdio.h>

int main()
{
	char arr[20] = "hello ";
	char* p = "my friend";
	strcat(arr, p);
	printf("%s\n", arr);

	return 0;
}

                        ②strcat模拟实现

        strcat模拟实现的思路:⑴找到目标指针的'/0'【指针加循环】

                                              ⑵将源字符串追加到目标指针的后面【可采用拷贝字符串的方法】

//模拟实现strcat
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* dest, const char* sorc)
{
	assert(dest && sorc);
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *sorc++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr[20] = "hello ";
	char* p = "my friend";
	my_strcat(arr, p);
	printf("%s\n", arr);

	return 0;
}

                ♥strcmp

                        ①函数介绍:

int strcmp(const char* str1,const char * str2);

● 功能:比较两个字符串的大小,从第一个字符开始,直到比出大小【ASCALL值】

                eg:"abc"小于"bcd"——a的值小于b

●标准规定:

        ○第一个字符串大于第二个字符串,则返回大于0的数字

        ○第一个字符串等于第二个字符串,则返回0

        ○第一个字符串小于第二个字符串,则返回小于0的数字

//strcmp使用示例
//注:VS环境下,strcmp的返回值为:1、0、-1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abq";
	char arr2[] = "abcdef";
	int ret1 = strcmp(arr1, arr2);
	int ret3 = strcmp(arr2, arr1);
	int ret2 = strcmp(arr1, arr1);
	printf("%d\n", ret1);
	printf("%d\n", ret2);
	printf("%d\n", ret3);
	return 0;
}


                         ②模拟实现

        模拟实现strcmp思路:⑴两个字符串一一比较【指针+循环】

                                            ⑵循环若跳出则依据指针内容判断字符串大小

//strcmp 模拟实现
#include <string.h>
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 && *str2)
	{
		if (*str1 > *str2)
			return 1;
		if(*str1 < *str2)
			return -1;
		str1++;
		str2++;
	}
	if (*str1 == '\0' && *str2=='\0')
		return 0;
	else if(*str2=='\0')
		return 1;
	if (*str1 == '\0')
		return - 1;
}
int main()
{
	char arr1[] = "abq";
	char arr2[] = "abcdef";
	int ret1 = my_strcmp(arr1, arr2);
	int ret3 = my_strcmp(arr2, arr1);
	int ret2 = my_strcmp(arr1, arr1);
	printf("%d\n", ret1);
	printf("%d\n", ret2);
	printf("%d\n", ret3);
	return 0;
}

   三、结语

        干货满满,有码有图,写文不易,看完的小伙伴们不要忘记动动手指点点赞,走个关注,三连互访!!!

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

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

相关文章

GEC6818 移植 rtl8723bu wifi驱动

文章目录1. 配置内核2、RTL8723BU 模块驱动编译2.1 下载解压2.2 配置编译3. openssl 移植3.1 下载解压3.2 配置3.3 编译安装4. libnl 移植4.1 下载解压4.2 进入源码目录并配置4.3 编译安装5. wpa_supplicant 移植5.1 解压源码5.2 配置5.3 make编译6. 启动wifi网卡6.1 配置WiFi连…

Python调用Go语言编译的动态链接库(CGO)【待续】

CGO C 语言作为一个通用语言&#xff0c;很多库会选择提供一个 C 兼容的 API&#xff0c;然后用其他不同的编程语言实现。Go 语言通过自带的一个叫 CGO 的工具来支持 C 语言函数调用&#xff0c;同时我们可以用 Go 语言导出 C 动态库接口给其它语言使用。 hello world程序 p…

【定时同步系列11】各种开环定时同步算法与MCRB性能对比的MATLAB仿真

重要声明:为防止爬虫和盗版贩卖,文章中的核心代码和数据集可凭【CSDN订阅截图或公z号付费截图】私信免费领取,一律不认其他渠道付费截图! 引言 开环定时同步包括内插控制、定时误差估计等环节,其中内插控制在之前的博客里有详细的描述,请翻阅之前的博客! 【定时同步系…

Python编程技巧分享:6 个必知必会高效 Python

编写更好的Python 代码需要遵循Python 社区制定的最佳实践和指南。遵守这些标准可以使您的代码更具可读性、可维护性和效率。 本文将展示一些技巧&#xff0c;帮助您编写更好的 Python 代码 遵循 PEP 8 风格指南 PEP 8 是 Python 代码的官方风格指南。它提供了一组用于格式化…

Maven parent多项目打包找不到reversion变量问题

项目结构&#xff1a;packagetest&#xff1a;顶级父级c1&#xff1a;子项目&#xff08;web项目&#xff09;c2&#xff1a;子项目(jar包)c1依赖c2的jar包。在父级maven中deploy成功&#xff0c;package也成功&#xff0c;私服上有都有包了。但是在c1上package的时候&#xff…

二十、操纵管道

本章将讨论如何在应用程序中使用多种方式操作管道。本章的部分内容都是很底层的&#xff0c;所以在开始阅读之前&#xff0c;请确保你需要一些编程知识&#xff0c;并对GStreamer有很好的理解。 这里将讨论的主题包括如何从应用程序向管道中插入数据&#xff0c;如何从管道中读…

电商项目之Mailgun邮件退信率升高

文章目录1 项目背景2 前言3 采取的措施4 排查的思路5 原因6 技术实现方案1 项目背景 运维人员进行日常巡检发现Mailgun邮件代发渠道的退信率不寻常&#xff0c;在某个时间段会飙高。这会有2个影响&#xff1a; &#xff08;1&#xff09;针对运维的角度&#xff0c;Mailgun官方…

3.SpringBoot配置

一、IOC的好处在对象依赖关系复杂的对象中&#xff0c;只需要考虑“我自己”依赖什么&#xff0c;减少程序员思考负担方便的进行依赖概念&#xff08;接口、抽象类&#xff09;的实现类对象的替换。二、什么是SpringBoot?1.SprigBoot是Spring的一个子工程&#xff0c;目标就是…

JS逆向技巧汇总---给普通爬虫学习者的吐血建议

爬虫实战的JS逆向&#xff0c;就像是做侦探。很多时候&#xff0c;我们要尝试不同方式和手段寻找线索&#xff0c;不能放过蛛丝马迹&#xff0c;通过仔细观察和比较&#xff0c;然后顺藤摸瓜&#xff0c;找到加密入口。再调试JS代码的时候&#xff0c;需要保持清晰的目标和方向…

专科逆袭入职腾讯,真是小母牛坐飞机,牛逼上天了..

在踏入腾讯&#xff0c;办理入职手续的那一天&#xff0c;作为一个男子汉&#xff0c;确实是落泪了。特地分享一波我的真实经历&#xff0c;共勉。 先说一下自己的个人情况&#xff0c;18 届应届生&#xff0c;通过校招进入到了国内某二线城市传统互联网公司&#xff0c;然后一…

优化算法:曲径步长通优处,优化半天白优化

本文来自公众号“AI大道理” 训练一个神经网络&#xff0c;我们想要得到误差最小&#xff0c;就是要我们的损失函数最小。 如何得到最小值呢&#xff1f; 这就是优化算法。 梯度下降法是众多优化中的一种。 1、损失函数 2、GD&#xff08;梯度下降法&#xff09; 3、BGD&a…

Java集合基础

文章目录集合基础一、集合介绍1. 什么是集合&#xff1f;2. 集合类型3. ArrayList 长度可变原理4. 集合和数组的使用选择二、ArrayList 集合快速入门集合创建语句泛型(<>)三、集合常用成员方法1. 增加元素2. 删除元素3. 修改元素4. 查找数据四、集合遍历1. 集合存储字符串…

国联易安:2023年网络安全“五大技术”预测

我国对网络安全非常重视&#xff0c;明确指出“安全是发展的前提&#xff0c;发展是安全的保障&#xff0c;安全和发展要同步推进”。作为国内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全产品解决方案与相关技术研究开发的领军企业&#xff0c;国联…

数学建模与数据分析 || 3. 面向数据的特征提取方法: 探索性数据分析

面向数据的特征提取方法: 探索性数据分析 文章目录面向数据的特征提取方法: 探索性数据分析1. 原始数据的准备1.1 导入 python 模块1.2 导入数据集并进行宏观认识1.3 数据集描述2. 数据的预处理2.1 缺失数据的甄别2.2 类别规模的评估3. 数据特征的处理3.1 第一个因变量- 分析范…

【Linux】Linux调试器-gdb使用

作者&#xff1a;小卢 专栏&#xff1a;《Linux》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1.背景 2.gdb的使用 2.1如何生成可以调试debug版本的文件&#xff1a; 2.2如何查看调试信息&…

wcf服务启动禁用Wcf测试客户端(WcfTestClient)

以下页面在WCF工程运行时&#xff0c;会自动启动wcf测试客户端。如果想禁止&#xff0c;可以通过这个方法。 如果希望F5时始终启动IE&#xff0c;可以在.csproj.user文件里增加EnableWcfTestClientForSVC属性配置以禁用WCF测试客户端&#xff1a; <Project> <ProjectE…

Excel等文件中出现新型恶意软件Dropper,通过钓鱼邮件传播

Dropper 是将 Payload 部署到失陷主机的恶意软件&#xff0c;被很多攻击者使用。2022 年第二季度研究人员发现了一些活跃的 Dropper&#xff0c;例如 Microsoft Excel 文件以及 Windows 快捷方式文件和 ISO 文件。通过与社会工程相结合的攻击方式&#xff0c;诱使受害者触发失陷…

打脸质疑者!Mobileye市值冲高,公司CEO说出心声

三个多月前&#xff0c; Mobileye以21美元发行价第二次在美股IPO上市。截止上周五&#xff0c;该公司股价升至32.98美元&#xff0c;市值达到264.47亿美元。相比于美股其他自动驾驶公司股价跌跌不休&#xff0c;显然&#xff0c;资本市场更看重企业的盈利能力和可预见的营收规模…

CVE-2023-24055漏洞复现

KeePass download | SourceForge.net 下载链接 直接咔咔安装 默认路径&#xff1a; 先汉化一下 汉化文件放进去 切换到 KeePass&#xff0c;单击 View → Change Language&#xff0c;然后选择您的语言。重新启动 KeePass 汉化成功。建立新数据库&#xff1a; 文件默认命名为…

HTTP协议详细解读

文章目录1. HTTP概念2. HTTP 特点3. HTTP 协议的工作过程4. 认识URL5. HTTP 请求数据格式6. HTTP 响应数据格式7. 总结&#x1f4c2;橙子精品文章学习推荐1. HTTP概念 HTTP&#xff1a;HyperText Transfer Protocol&#xff0c;超文本传输协议。HTTP 协议规定了浏览器和服务器…