进阶C语言-字符函数和字符串函数

在这里插入图片描述

字符函数和字符串函数

  • 🎈1.函数介绍
    • 🔎1.1strlen函数
      • 🔭1.1.1strlen函数的模拟实现
        • 📖1.计数器法
        • 📖2.递归法
        • 📖3.指针-指针
    • 🔎1.2strcpy函数
      • 🔭1.2.1strcpy函数的模拟实现
    • 🔎1.3strcat函数
      • 🔭1.3.1strcat函数的模拟实现
    • 🔎1.4strcmp函数
      • 🔭1.4.1strcmp函数的模拟实现
    • 🔎1.5strncpy函数
    • 🔎1.6strncat函数
    • 🔎1.7strncmp函数
    • 🔎1.8strstr函数
    • 🔎1.9strtok函数

🎈1.函数介绍

🔎1.1strlen函数

在这里插入图片描述
✅注意事项:

  • 字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包括'\0'
  • 参数指向的字符串必须以'\0'结束
  • 注意函数的返回值是size_t,是无符号的
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//库函数
//strlen用来求字符串长度
//本质上是统计字符串中\0之前的字符个数
int main()
{
	const char* str = "abcdef";
	size_t len1 = strlen(str);
	size_t len2 = strlen("abcdef");
	size_t len3 = strlen("abc\0edf");
	printf("%d\n", len1);
	printf("%d\n", len2);
	printf("%d\n", len3);
	return 0;
}

✅运行示例:
在这里插入图片描述

🔭1.1.1strlen函数的模拟实现

📖1.计数器法

assert函数作用是断言,断言是一种除错机制,用于验证代码是否符合编码人员的预期。编码人员在开发期间应该对函数的参数、代码中间执行结果合理地使用断言机制,确保程序的缺陷尽量在测试阶段被发现。使用assert函数时需要添加头文件#include <assert.h>.
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)//字符串是放在常量字符串中,不能被改变,所以这里最好用用const修饰一下
{
	assert(str != NULL);//p如果接收过来的是空指针,那么这里运行会崩溃的,所以这里用assert函数断言一下
	int count = 0;//计数
	while (*str != '\0')
	{
		count++;//当它的字符不等于'\0'时,计数加一
		str++;//再往下一个字符找
	}
	return count;
}
int main()
{
	const char* str = "abcdef";
	printf("%d", my_strlen(str));
	return 0;
}

✅运行示例:
在这里插入图片描述

📖2.递归法
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
	assert(str != NULL);
	if (*str != '\0')
	{
		return 1 + my_strlen(str + 1);
	}
	else
		return 0;
}
int main()
{
	const char* str = "abcdef";
	printf("%d", my_strlen(str));
	return 0;
}

✅运行示例:
在这里插入图片描述

📖3.指针-指针
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
	assert(str != NULL);
	const char* start = str;//定义一个指针放字符串首字符的地址,因为*str接收的字符串为常量字符串,所以这里最好也用const修饰一下
	while (*str != '\0')
	{
		str++;
	}
	return str - start;
}
int main()
{
	const char* str = "abcdef";
	printf("%d", my_strlen(str));
	return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.2strcpy函数

在这里插入图片描述

  • 源字符串必须以'\0'结束
  • 会将源字符串中的'\0'拷贝到目标空间
  • 目标空间必须足够大,以保证能存放源字符串
  • 目标空间必须可变
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[10] = { 0 };
	char arr2[10] = "Hello";
	printf("%s\n", strcpy(arr1, arr2));
	return 0;
}

✅运行示例:
在这里插入图片描述
在这里插入图片描述
注:strcpy函数会将源字符串中的'\0'拷贝到目标空间。

🔭1.2.1strcpy函数的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
	char *ret = dest;
	assert(dest && src);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "Hello";
	printf("%s\n",my_strcpy(arr1, arr2));
	return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.3strcat函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "Hello";
	char arr2[] = "World";
	printf("%s\n", strcat(arr1, arr2));
	return 0;
}

✅运行示例:
在这里插入图片描述

🔭1.3.1strcat函数的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* my_strcat(char* dest, char* src)
{
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "Hello";
	char arr2[] = "World";
	printf("%s\n", my_strcat(arr1, arr2));
	return 0;
}

✅运行示例:
在这里插入图片描述
注意:

  • 目标空间必须足够大,还需要可以修改。
  • 目标空间必须得有'\0'(保证找到目标空间的末尾)。
  • 源字符串中也得有'\0',在拷贝时将源字符串中的'\0'也要拷贝过去。

🔎1.4strcmp函数

在这里插入图片描述

  • 第一个字符串大于第二个字符串,返回大于0的数字。
  • 第一个字符串小于第二个字符串,返回小于0的数字。
  • 第一个字符串等于第二个字符串,返回0。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "Hello";
	char arr2[] = "World";
	printf("%d\n", strcmp(arr1, arr2));
	return 0;
}

✅运行示例:
在这里插入图片描述

🔭1.4.1strcmp函数的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}
int main()
{
	char arr1[] = "Hello";
	char arr2[] = "World";
	printf("%d\n", my_strcmp(arr1, arr2));
	return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.5strncpy函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "World";
	printf("%s\n", strncpy(arr1, arr2,3));
	return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.6strncat函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "hi";
	char arr2[] = "World";
	printf("%s\n", strncat(arr1, arr2, 3));
	return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.7strncmp函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "Worle";
	char arr2[] = "World";
	printf("%d\n", strncmp(arr1, arr2, 3));
	return 0;
}

✅运行示例:
在这里插入图片描述

🔎1.8strstr函数

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abcdefghi";
	char arr2[] = "op";
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到!\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

✅运行示例:
在这里插入图片描述
在这里插入图片描述

🔎1.9strtok函数

在这里插入图片描述

  • delimiters参数是个字符串,定义了用作分隔符的字符集合。
  • 第一个参数指定一个字符串,它包含了0个或多个由delimiters字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用'\0'结尾,返回一个指向这个标记的指针。
  • strtok函数的第一个参数不为NULL,函数找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串不存在更多的标记,则返回NULL指针。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "angle@qq.com";
	char buf[200] = { 0 };
	strcpy(buf, arr);
	const char* p = "@.";
	char* s = NULL;
	for (s = strtok(buf, p); s != NULL; s = strtok(NULL,p))
	{
		printf("%s\n", s);
	}
	return 0;
}

✅运行示例:
在这里插入图片描述

好啦,关于字符串函数的知识到这里就先结束啦,后期会继续更新学习C语言的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VGN S99快捷键,说明书

VGN S99快捷键-说明书 按键说明灯光效果常见疑难 按键说明 切换关闭电量指示灯&#xff1a;Fn home 灯光效果 常见疑难

burpsuite issue definitions

https://portswigger.net/burp/documentation/scanner/vulnerabilities-list 先从高危的开始学(四十能学剑&#xff0c;时人无此心)&#xff1a; os command injection todo 未完待续

一些好用的12款前端小插件

1. cropper.js Cropper.js 2.0 是一系列用于图像裁剪的 Web 组件。 官网地址&#xff1a;https://fengyuanchen.github.io/cropperjs/v2/zh/ 2. Vditor Vditor是一款浏览器端的 Markdown 编辑器&#xff0c;支持所见即所得、即时渲染&#xff08;类似 Typora&#xff09;和分…

php请求okx接口获取比特币价格数据、k线数据

php请求okx接口获取比特币价格数据 环境配置请求头、签名设置签名配置代理 全部代码 环境 我本地用的是thinkphp框架和guzzle 安装guzzle composer require guzzlehttp/guzzle 配置请求头、签名 我们需要准备api_key&#xff0c;secret_key&#xff0c;passphrase api_key…

docker (镜像分层、阿里云镜像推送/拉去)-day02

一、镜像概念 Docker 镜像是 Docker 容器的基础&#xff0c;它提供了一种可重复使用的、跨平台的部署方式&#xff0c;使得应用程序的部署和运行变得简单和高效。 把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),打包好…

ethtool工具添加并验证网口

Filesystem Packages->console->network->ethtool 命令描述&#xff1a; ethtool 是用于查询及设置网卡参数的命令。 使用命令&#xff1a; ethtool ethx //查询ethx网口基本设置&#xff0c;其中 x 是对应网卡的编号&#xff0c;如eth0、eth1等等 ethtool –…

利用 LD_PRELOAD劫持动态链接库,绕过 disable_function

目录 LD_PRELOAD 简介 程序的链接 动态链接库的搜索路径搜索的先后顺序&#xff1a; 利用LD_PRELOAD 简单的劫持 执行id命令 反弹shell 引申至 PHP 绕过disable_function 方法1&#xff1a;使用蚁剑的扩展工具绕过disable_function 方法2&#xff1a;利用 mail 函数…

推荐几款免费的智能AI伪原创工具

在当今信息快速传播的时代&#xff0c;创作者们常常为了在激烈的竞争中脱颖而出而苦苦挣扎&#xff0c;而其中的一项挑战就是创作出独具创意和独特性的内容。然而&#xff0c;时间有限的现实让很多人望而却步。在这个背景下&#xff0c;免费在线伪原创工具成为了创作者们的得力…

Windows核心编程 HOOK

目录 HOOK概述 HOOK API SetWindowsHookExA 函数(winuser.h) UnhookWindowsHookEx 函数(winuser.h) NextHookEx 函数(winuser.h) 局部钩子 全局钩子 为什么全局钩子需要用dll作为过程函数&#xff1f; HOOK概述 本质&#xff1a;Windows消系统的消息过滤器。 全局钩子…

还在愁没项目?来瞧瞧这些另类赚钱方式

客套话不多说&#xff0c;直接上案例&#xff0c;这些都是正儿八经的真实案例&#xff0c;相信大家通过这些人的案例自然能摸索整理出一套属于自己的项目&#xff01;摸索不出&#xff0c;也多多少少能受一些灵感上的启发。 小A是长期混B站的&#xff0c;大家称他为“B站搬运工…

直流负载与交流负载的作用

直流负载和交流负载都是用来消耗电能的装置或设备&#xff0c;它们的作用是将电能转化为其他形式的能量&#xff0c;以满足特定的需求。直流负载主要用于直流电路中&#xff0c;例如直流电源、电池等。它们可以将直流电能转化为热能、光能、机械能等。直流负载在很多领域都有广…

【BSP开发经验】uboot gpl框架开发经验

文章目录 uboot_gpl 隔离 的目的uboot_gpl 隔离基本原理uboot_gpl 基本框架uboot_gpl 适配新平台的方式uboot 添加hikcmd功能适配调试步骤 链接脚本语法链接脚本的格式链接脚本的简单示例设置入口点&#xff08;entry&#xff09;设置输出文件名处理目标文件格式的命令uboot_gp…

whatsapp信息群发脚本开发!

WhatsApp 作为全球广受欢迎的通讯应用&#xff0c;在我们的日常生活中扮演着重要角色&#xff0c;有时候&#xff0c;我们需要向大量联系人发送消息&#xff0c;比如营销推广、活动通知等。 一个个手动发送消息?那简直太落后了!今天&#xff0c;我们将探讨如何利用脚本开发实…

web:catcat-new(文件包含漏洞、flask_session伪造)

前提知识 /etc/passwd 该文件储存了该Linux系统中所有用户的一些基本信息&#xff0c;只有root权限才可以修改。其具体格式为 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell&#xff08;以冒号作为分隔符&#xff09; /proc/self proc是一个伪文件系统…

项目终验的exce表格缩放,排版等经常使用

xxx个项目的验收资料 1.申请表等等很多信息 需求&#xff1a;放在一页内等办法 上述文档&#xff0c;在excel表格打印预览中都是在两页中&#xff0c;很难调节&#xff0c;这个时候采用wps专业版本即可。 wps排版经常使用的功能如下&#xff1a; 经常使用的是 1.把所有列打印…

Apache Doris 整合 FLINK CDC 、Paimon 构建实时湖仓一体的联邦查询入门

1.概览 多源数据目录&#xff08;Multi-Catalog&#xff09;功能&#xff0c;旨在能够更方便对接外部数据目录&#xff0c;以增强Doris的数据湖分析和联邦数据查询能力。 在之前的 Doris 版本中&#xff0c;用户数据只有两个层级&#xff1a;Database 和 Table。当我们需要连…

网络视频怎么更改IP?使用静态IP更改地址有哪些好处?

随着互联网的普及&#xff0c;越来越多的人开始使用网络视频。有时候&#xff0c;我们可能会遇到需要更改网络视频的IP地址的情况。那么&#xff0c;如何更改IP地址呢&#xff1f;使用静态IP更改地址又有哪些好处呢&#xff1f; 首先&#xff0c;我们来了解一下什么是静态IP地址…

外贸行业多人文件共享云盘推荐

Zoho WorkDrive外贸行业解决方案致力于为各类外贸企业客户提供数字化转型的支持&#xff0c;全面覆盖市场调研、客户服务与管理、产品设计与制作、采购、供应商管理、财务对账、单证报关、仓储管理以及物流运输等环节。Zoho WorkDrive企业网盘提供文件资料在线存储、共享、同步…

C/C++转义符:\x

文章目录 什么是转义符使用"\x"定义char数组宏定义中的\ 什么是转义符 在C语言中&#xff0c;转义符用于将一些特殊字符表示为单个字符&#xff0c;常用的转义符有&#xff1a; \\&#xff1a;反斜杠符号\&#xff1a;单引号\"&#xff1a;双引号\a&#xff1…

动态规划--使用最小花费爬楼梯

题目描述 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 示例…