C详细的字符串函数

但行前路,莫问归期

在这里插入图片描述

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

文章目录

      • strlen
      • strcpy
        • strncpy
      • strcat
        • strncat
      • strcmp
        • strncmp
      • strstr
      • strtok
      • strerror
      • 字符串大小写转换
        • strupr
        • strlwr
      • memcpy
      • memmove
      • memcmp

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了。


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

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

相关文章

Typescript -尚硅谷

基础 1.ts是以js为基础构建的语言&#xff0c;是一个js的超集(对js进行了扩展)&#xff1b; 2.ts(type)最主要的功能是在js的基础上引入了类型的概念; Js的类型是只针对于值而言&#xff0c;ts的类型是针对于变量而言 Ts可以被编译成任意版本的js&#xff0c;从而进一步解决了…

MySQL Command Line Client 运行闪退问题解决,缺少my.ini文件

MySQL Command Line Client 运行闪退问题解决&#xff1a; 问题排查&#xff1a; 1.找到Command Line Client的路径位置&#xff0c;并查看属性&#xff0c;步骤截图&#xff1a; 查看属性&#xff1a; 查看属性中的目标路径&#xff1a; 2.进入属性中的目标路径&#xff0c;…

基于SSM+Vue的电子商城的设计与实现

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

记录--vue3 setup 中国省市区三级联动options最简洁写法,无需任何库

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在写页面的时候&#xff0c;发现表单里面有一个省市区的 options 组件要写&#xff0c;因为表单很多地方都会用到这个地址选择&#xff0c;我便以为很简单嘛。 虽然很简单的一个功能&#xff0c;但是网…

C#中的扩展方法---Extension

C#中扩展方法是C# 3.0/.NET 3.x 新增特性&#xff0c;能够实现向现有类型中“添加”方法&#xff0c;以下主要介绍C#中扩展方法的声明及使用。 1、扩展方法的声明 扩展方法使能够向现有类型“添加”方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改原始类型…

安全通信网络(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1网络架构 1.1保证网络…

开发知识点-Python

Python从小白到入土 python渗透测试安全工具开发锦集Python安全工具编程基础第一章 Python在网络安全中的应用第一节 Python黑客领域的现状第二节 我们可以用Python做什么第三节 第一章课程内容总结 第二章 python安全应用编程入门第一节 Python正则表达式第二节 Python Web编程…

虚幻引擎:如何进行关卡切换?无缝切换?

一丶非无缝切换 在切换的时候会先断开连接,等创建好后才会链接,造成体验差 蓝图中用到的节点是 Execute Console Command 二丶无缝切换 链接的时候不会断开连接,中间不会出现卡顿,携带数据转换地图 1.需要在gamemode里面开启无缝漫游,开启之后使用上面的切换方式就可以做到无缝…

VueRequest——管理请求状态库

文章目录 前言一、为什么选择 VueRequest&#xff1f;二、使用步骤1.安装2.用例 前言 VueRequest——开发文档 VueReques——GitHub地址 在以往的业务项目中&#xff0c;我们经常会被 loading 状态的管理、请求的节流防抖、接口数据的缓存、分页等重复的功能实现所困扰。每次开…

选购Ipad以及投入学习生产(玩耍)

图片 from Pinterest Ipad Air 5 趁着2023年暑期教育优惠购入&#xff0c;Ipad Air 5 64G版本&#xff0c;附送Apple pencil 2&#xff0c;加上Apple Care服务&#xff08;2年&#xff09;&#xff0c;花费&#xffe5;4899&#xff1b; 因为我知道苹果的电池几年下来就不行了…

动态规划(4)---Leetcode.746使用最小花费爬楼梯

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

Python之文件与文件夹操作及 pytest 测试习题

目录 1、文本文件读写基础。编写程序&#xff0c;在 当前目录下创建一个文本文件 test.txt&#xff0c;并向其中写入字符串 hello world。2、编写一个程序 demo.py&#xff0c;要求运行该程序后&#xff0c;生成 demo_new.py 文件&#xff0c;其中内容与demo.py 一样&#xff0…

C语言——求 n 以内(不包括 n)同时能被 3 和 7 整除的所有自然数之和的平方根 s,n 从键盘输入。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<math.h> int main() {int i,n;double s0.0;printf("输入任意一个自然数&#xff1a; ");scanf("%d",&n);for(i1;i<n;i) {if(i%30&&i%70){si;}}ssqrt(s);printf(…

Linux C 目录编程

目录编程 前言目录编程函数mkdir  创建目录rmdir  删除目录opendir  打开目录readdir  读取目录stat  获取文件信息chdir  跳转目录closedir  关闭目录 判断文件类型的宏遍历指定目录及子目录下所有.c文件示例 前言 相较于文件编程&#xff0c;目录编程也有一套自…

druid连接池异常GetConnectionTimeoutException(原创)

问题描述 有天&#xff0c;测试同学突然反馈系统页面查询缓慢&#xff0c;影响使用&#xff0c;我查了日志报&#xff1a; druid 连接池异常 GetConnectionTimeoutException wait millis 9120, active 20, maxActive 20 creating 0 结论先行 经一系列排查&#xff0c;得出数…

在线生成二维码--支持彩色二维码和包含Logo

具体请前往&#xff1a;在线二维码生成工具--可将网址等内容生成为指定大小&#xff0c;指定颜色的彩色二维码,同时支持添加Logo

立冬特辑-----链表OJ题优选合集~~

目录 ​​​​​​​前言&#x1f333; 1.链表中倒数第k个结点&#x1f338; 1.1 思路 1.2 代码 2. 链表的回文结构&#x1fab8; 2.1 思路 2.2 代码 3.相交链表&#x1f32a;️ 3.1 思路 3.2 代码 4.环形链表I&#x1f30a;&#x1f6f3;️ 4.1 思路 4.2 代码 4…

21.合并两个有序链表(LeetCode)

合并两个有序链表&#xff0c;是链表的经典题之一 &#xff0c;这里给出一种经典解法 想法一 创建head和tail两个指针&#xff0c;从头比较两个链表&#xff0c;取小的尾插&#xff0c;注意一开始指针的初始化&#xff0c;接着就是不断利用tail指针&#xff0c;链接比较之中较…

ChatGPT+Roblox,元宇宙的AI叙事逻辑#Leveling Up

MixCopilot 嗨&#xff0c;亲爱的听众朋友们&#xff01;欢迎收听我们的播客节目&#xff01;我是你们的主播&#xff1a;MixCopilot 混合副驾。今天我们要为大家带来的是我们的AI革命系列节目之一。这个系列节目聚焦于AI领域的一些最有影响力的建设者&#xff0c;他们将会讨论…

2023.11.11 关于 Spring 中 Bean 的作用域

目录 Bean 的作用域 作用域的定义 Singleton&#xff08;单例作用域&#xff09; Prototype&#xff08;原型作用域&#xff09; Request&#xff08;请求作用域&#xff09; Session&#xff08;会话请求&#xff09; Application&#xff08;全局作用域&#xff09; …