C字符函数及字符串函数

news2024/11/19 14:50:58

但行前路,莫问归期

在这里插入图片描述

要注意的是,要使用下边所讲的函数要包含头文件<string.h>

strlen

求字符串的长度
在这里插入图片描述

  • 函数参数:字符串指针
  • 函数功能:传入字符串指针,字符串是以\0为结束标志,返回的类型size_t其实就是unsigned int,函数返回的是字符串中**‘\0’前边字符的个数**,传入字符串指针用const修饰*str,防止函数意外修改传入的字符串。
  • 返回值类型:无符号整形,即结束标志前字符数量

函数功能演示
在这里插入图片描述
查找到’\0’就结束演示
在这里插入图片描述
模拟实现
根据函数的功能,返回值来编写
扩展一笔

unsigned int _strlen(const char *arr)
{
	int count = 0;//计数
	while (*arr)
	{
		count++;
		arr++;//字符指针向后走
	}
}

strcpy

在这里插入图片描述

  • 函数参数:一个是目的地,另一个是源头。
  • 函数功能:将源头字符串拷贝到目标空间。
  • 返回值:返回拷贝完成后第一个字符串的地址。

注意:
1,源字符串必须以’\0’结尾。不能这样搞

char arr[4]={'a','b','c','d'}

 如果第二个参数是这样一个没有结束标志’\0’的字符串,那么函数在实现时就会一直往后找,就会越界访问产生错误。
2,函数会将源字符串的结束标志’\0’也会拷贝过去。
可以调试观察
在这里插入图片描述
 在打印时,遇到’\0’就结束,不要误以为该函数清空了原来的内容。
模拟实现(记得包含头文件assert.h)

char* _strcpy(char* dest, const char* src)
{
	char* ret = dest;//保存dest的首地址
	assert(dest != NULL);
	assert(src != NULL);
	while (*src!='\0')//\0之前全部OK
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//\0也搞过来
	return ret;
}
strncpy

和strcpy不同的是,多了一个参数。
在这里插入图片描述

 拷贝num个字节过去,如果源字符串已经没有元素了,就将dst后边的字节变成零。
函数功能展示:
在这里插入图片描述


strcat

  • 参数:这个函数的参数和strcpy一模一样。
  • 功能:strcpy在目标字符串的开头拷贝源字符串,但strcat是在目标字符串的末尾,即结束标志’\0’位置开始将源字符串拷贝到目标字符串。
  • 返回值:和strcpy一样,返回目标字符串的指针。

功能呈现:
在这里插入图片描述
函数模拟实现:

char* _strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}//找到目标字符串的末尾
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
strncat

和前边strcpy和strncpy的区别一样。
在这里插入图片描述
函数功能演示:
在这里插入图片描述


strcmp

字符串比较函数
在这里插入图片描述

  • 参数:两个,他们两个之间的比较
  • 功能:以两个字符串的每个字符以ASCII码值逐个比较
  • 第一个字符串如果大于第二个字符串,就返回大于零的数字。
  • 第一个字符串等于第二个字符串,就返回0。
  • 第一个字符串小于第二个字符串,就返回小于零的数字。
  • 返回值:上边已经说明。

函数功能呈现
f的ASCII在‘\0’之前。大于返回1(大于0的数)
在这里插入图片描述
如果等于返回零。
在这里插入图片描述
小于返回-1(小于0的数)
在这里插入图片描述
函数模拟实现

int _strcmp(const char* src, const char* dest)
{
	int ret = 0;
	assert(src != NULL);
	assert(dest != NULL);
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest)
	{
		++src;
		++dest;
	}
	if (ret < 0)
	{
		return -1;
	}
	else if (ret > 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
strncmp

不再是从头比较到尾,而是比较num个字符。
函数功能演示:
在这里插入图片描述


strstr

在这里插入图片描述

  • 参数:传入两个字符指针。
  • 功能:在str1中找到str2第一次出现的位置。
  • 返回值:返回找到该位置的指针。如果没有找到,就返回NULL。

函数功能呈现
在这里插入图片描述
函数模拟实现

char* _strstr(const char* str1, const char* str2)
{
	char* cp = str1;
	char* s1, * s2;
	if (!*str2)
	{
		return str1;//如果str2为空,返回str1
	}
	while (*cp)
	{
		s1 = cp;
		s2 = str2;//传入参数不可以修改
		while (*s1 && *s2 && !(*s1 - *s2))
		{
			s1++;
			s2++;
		}
		if (!*s2)//如果跳出循环且s2已经是'\0’了。
		{
			return cp;
		}
		cp++;
	}
	return NULL;
}

strtok

在这里插入图片描述

  • 参数:第一个参数为目标字符串,第二个参数为分隔符集合
  • 函数功能:第一个参数即目标字符串是包含0个或者多个由分隔符分割而成的字符串。
    strtok会找到str中的一个标记,并将这个标记更改为\0,返回一个指向这个标记的指针(strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符创一般都是临时拷贝的内容且允许修改)。
     strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存他在字符串中的位置。
     如果函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 返回值:如果目标字符串中不存在标记的分割字符,就返回NULL指针,如果找到,将该标记设置为结束标志\0。

函数功能展示
在这里插入图片描述
调试动图展示,会让你更加清晰了解函数的功能
在这里插入图片描述
上边是作者滴QQ,欢迎大家一起学习交流,嘿嘿。


strerror

在这里插入图片描述
要使用这个函数,需要包含头文件<errno.h>

  • 函数参数:errnum–错误号,通常是errno
  • 函数功能:返回一个指向错误字符串的指针,该错误字符串描述了错误errnum。
  • 函数解释:这个函数会从内部搜索错误号,返回一个指向该错误信息字符串的指针,即错误消息字符在头文件中,程序运行时若有错误,strerror会捕获错误类型并返回一个指针,这个指针指向错误消息字符。

函数功能演示:
在这里插入图片描述
 由于当前文件内并没有heihei这个文件,以只读的方式打开搜索该文件是找不到的,所以返回的错误信息就是没有相关文件或者相关文件已经被销毁。
这里文件相关操作有遗忘的小伙伴可以移步文件超消息讲解来回顾回顾。


字符串大小写转换

strupr
  • 语法格式如下:
    strupr(字符串);(要注意,新的编译器规定使用该函数式要加上_)
  • 函数功能:将字符串中的小写字符转换成大写字母,其他字母不变。

函数功能实现:
在这里插入图片描述

strlwr

格式相同,功能相反
演示如下:
在这里插入图片描述


memcpy

在这里插入图片描述

  • 函数参数:目标字符串,源字符串,数量(unsigned int),void类型可以适配多种类型。
  • 函数功能:函数功能和strncpy很相似,只是memcpy可以操作的类型更加丰富,从源字符串首元素位置开始,向后拷贝num个字节的数据到目标字符串的位置,这个函数遇到’\0’不会停下来,且如果源字符串和目标字符串有重叠时,拷贝结果是未定义的。

例如,需要拷贝四个字节字符。而源字符串在目标字符串前3个子节的位置。
在这里插入图片描述
 本意是将1,2,3,4全部拷贝过去,然而在第一次拷贝时,元素1已经把元素4覆盖。
这与背后函数的实现有关,没有做重叠时的处理。
函数模拟实现如下:

void* _memcpy(void* dst, const void* src, size_t count)
{
	void* ret = dst;//记录目标数组的地址
	assert(dst);
	assert(src);
	while (count--)
	{
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return ret;
}

memmove

 函数memcpy存在重叠问题的话,memmove就是用来解决这个问题的,如果源空间和目标空间存在重叠的话,就得使用memmove函数处理。
函数格式和作用和momcpy一模一样。
函数功能呈现:
在这里插入图片描述
模拟实现:

void* _memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	if (dst <= src || (char*)dst >= ((char*)src + count))
	{
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else//从后往前拷贝
	{
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
}

memcmp

在这里插入图片描述

  • 两个数组(可以是字符数组,也可以是其他类型)相比,num个字节,void*可以适配多种类型。
  • 函数功能和strcmp一样,可以适配的类型更多了而已。

函数功能呈现:
在这里插入图片描述
整型四个字节,两个数组前两个元素相等,故返回值0。
在这里插入图片描述
更改为12个字节,返回值就变为-1了。


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

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

相关文章

Linux操作系统使用及C高级编程-D2软件包管理

有两种类型的软件包&#xff1a;二进制软件包(deb)和源码包(deb-src) 二进制软件包(Binary Packages)&#xff1a;包含可执行文件、库文件、配置文件、main/info页面、版权声明和其他文档 源码包(Source Packages)&#xff1a;包含软件源代码、版本修改说明、构建指令及编译工…

企业如何解决被“薅羊毛”

随着互联网的普及和电子商务的兴起&#xff0c;越来越多的消费者选择在线购物。然而&#xff0c;一些消费者可能会利用企业的促销活动或优惠券来获取额外优惠&#xff0c;甚至恶意攻击企业的营销资金。这种行为被形象地称为“薅羊毛”。 对于企业而言&#xff0c;如何解决被“薅…

AI系统ChatGPT源码+详细搭建部署教程+AI绘画系统+支持GPT4.0+Midjourney绘画+已支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

作用域插槽slot-scope

一般用于组件封装&#xff0c;将使用props传入组件的数据再次调出来或者单纯调用组件中的数据。也可用于为组件某个部分自定义样式以及为某次使用组件自定义样式。 直接拿elementui的el-table举例&#xff1a; <template><el-table v-loading"loading&q…

PDF Expert for mac(专业pdf编辑器)苹果电脑

PDF Expert for Mac 是一款功能强大、界面简洁的PDF阅读、编辑和转换工具&#xff0c;为Mac用户提供了全面而便捷的PDF处理体验。无论是日常工作中的文档阅读、标注&#xff0c;还是专业需求下的编辑、转换&#xff0c;PDF Expert 都能满足您的各种需求。 首先&#xff0c;PDF…

Leetcode-94 二叉树的中序遍历

递归实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

RustRover里使用AI通义灵码来写代码

AI通义灵码我选择RustRover里的 plugin进行下载使用 然后我们就提问好了&#xff1a;让他用c语言写一个冒泡排序程序 #include <stdio.h>void bubble_sort(int arr[], int size) {int i, j, temp;for (i 0; i < size - 1; i) {for (j 0; j < size - i - 1; j) {i…

RabbitMQ 之 Work Queues 工作队列

目录 一、轮训分发消息 1、抽取工具类 2、启动两个工作线程 3、生产者代码 4、结果展示 二、消息应答 1、概念 2、自动应答 3、消息应答的方法 4、Multiple 的解释 5、消息自动重新入队 6、消息手动应答代码 &#xff08;1&#xff09;生产者 &#xff08;2&#…

【CodeTop】TOP 100 刷题 1-10

文章目录 1. 无重复字符的最长子串题目描述代码与思路 2. 反转链表题目描述代码与解题思路 3. LRU 缓存题目描述代码与解题思路 4. 数组中的第K个最大元素题目描述代码与解题思路 5. K 个一组翻转链表题目描述代码与解题思路 6. 三数之和题目描述代码与解题思路 7. 最大子数组和…

Edge浏览器新建标签页如何更改为指定网址

Edge浏览器新建标签页如何更改为指定网址&#xff1f; 启动时新建标签页 不是说启动时&#xff0c;而是加号新建标签页时候 启动时 新建标签页 New Tab Changer 可以了 如果没有需要应用商店下载 参考文章

Qframework 中超级方便的kitres

using QFramework; using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestResKit : MonoBehaviour {ResLoader mResLoader ResLoader.Allocate();private void Awake(){}/// <summary>/// 每一个需要加载资源的单元(脚本,界…

FiRa标准——MAC实现(二)

在IEEE 802.15.4z标准中&#xff0c;最关键的就是引入了STS&#xff08;加扰时间戳序列&#xff09;&#xff0c;实现了安全测距&#xff0c;大大提高了测距应用的安全性能。在FiRa的实现中&#xff0c;其密钥派生功能是非常重要的一个部分&#xff0c;本文首先对FiRa MAC中加密…

element-plus 循环生成的多个input输入框如何校验

我们知道正常写出来的input输入框如何校验&#xff0c;那循环出来的输入框应该怎么校验咧&#xff0c;这里就教大家如何的去校验通过循环出来的输入框。 首先先看单个的input如何做校验 <template><div><el-form ref"ruleFormRef" :model"ruleF…

面试题:说一下公司常用MySQL分库分表方案

文章目录 一、数据库瓶颈1、IO瓶颈2、CPU瓶颈 二、分库分表1、水平分库2、水平分表3、垂直分库4、垂直分表 三、分库分表工具四、分库分表步骤五、分库分表问题1、非partition key的查询问题2、非partition key跨库跨表分页查询问题3、扩容问题 六、分库分表总结 一、数据库瓶颈…

使用MVS-GaN HEMT紧凑模型促进基于GaN的射频和高电压电路设计

标题&#xff1a;Facilitation of GaN-Based RF- and HV-Circuit Designs Using MVS-GaN HEMT Compact Model 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;19年&#xff09; 摘要—本文阐述了基于物理的紧凑器件模型在研究器件行为细微差异对电路和系统…

Linux中的粘滞位

目录 粘滞位1、作用2、为什么添加粘滞位3、演示粘滞位的使用方法和效果 粘滞位 1、作用 为了多人协作写进行文件创作时&#xff0c;other用户没有办法将文件删除&#xff0c;只有超级管理员、该目录的所有者、该文件的所有者他们可以删除。 2、为什么添加粘滞位 你想在进行…

rabbitmq延迟队列发送与取消

安装延迟插件 根据rabbitmq的版本下载插件版本 # 延迟队列插件下载地址 https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases# 将本地下载好的插件复制到docker里 # docker cp rabbitmq_delayed_message_exchange-3.9.0.ez 容器名:/plugins docker cp r…

数据结构预算法--链表(单链表,双向链表)

1.链表 目录 1.链表 1.1链表的概念及结构 1.2 链表的分类 2.单链表的实现(不带哨兵位&#xff09; 2.1接口函数 2.2函数的实现 3.双向链表的实现&#xff08;带哨兵位&#xff09; 3.1接口函数 3.2函数的实现 1.1链表的概念及结构 概念&#xff1a;链表是一种物理存储结…

基于SSM的学生就业管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

K8S知识点(八)

&#xff08;1&#xff09;实战入门-Label 通过标签实现Pod的区分&#xff0c;说白了就是一种标签选择机制 可以使用命令是否加了标签&#xff1a; 打标签&#xff1a; 更新标签&#xff1a; 筛选标签&#xff1a; 修改配置文件&#xff0c;重新创建一个pod 筛选&#xff1…