【C语言】字符/字符串+内存函数

目录

Ⅰ、字符函数和字符串函数

        1 .strlen

        2.strcpy

        3.strcat

        4.strcmp

        5.strncpy

        6.strncat

        7.strncmp

        8.strstr

        9.strtok

        10.strerror

        11.字符函数 

        12. 字符转换函数

Ⅱ、内存函数

         1 .memcpy

        2.memmove

        3.memcmp

        4.memset 


Ⅰ、字符函数和字符串函数

        1 .strlen

函数原型:

注意事项:

1.字符串以  '\0' 作为结束标志 strlen 函数返回的是在字符串中 '\0' 前面 出现的字符个数( 不包含 '\0' )
2.参数指向的字符串 必须要以 '\0' 结束
3.注意函数的 返回值 size_t ,是无符号的( 易错
4.学会 strlen 函数的模拟实现

模拟实现:三种方法(计数器,递归,指针-指针

//模拟实现strlen
//方法一:计数器
size_t my_strlen1(const char* str)
{
	char* st = str;
	size_t count = 0;
	while (*st++)
	{
		count++;
	}
	return count;
}
//方法二:递归
size_t my_strlen2(const char* str)
{
	if (*str == '\0')
		return 0;
	return 1 + my_strlen2(++str);//注意这里不能用   后置++
}
//方法三:指针-指针
size_t my_strlen3(const char* str)
{
	char* st = str;
	while (*st != '\0')
	{
		//printf("%p\n", str);//  从小地址往大地址编址
		st++;
	}
	return st-str;
}

        2.strcpy

函数原型:

注意事项:

1.Copies the C string pointed by source into the array pointed by destination, including the
terminating null character (and stopping at that point).
2.源字符串 必须以 '\0' 结束
3.会将 源字符串 中的 '\0' 拷贝到 目标空间
4.目标 空间必须足够大 ,以确保能存放源字符串。
5.目标 空间必须可变
6.学会模拟实现。

模拟实现:

//模拟实现strcpy
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* cur = src; char *re = dest;
	while (*dest++ = *src++);
	return re;
}

        3.strcat

函数原型:

注意事项:

1.Appends a copy of the source string to the destination string. The terminating null character
in destination is overwritten by the first character of source, and a null-character is included
at the end of the new string formed by the concatenation of both in destination.
2.源字符串 必须以 '\0' 结束
3.目标 空间 必须有 足够 的大,能容纳下源字符串的内容。
4.目标空间必须 可修改
5.字符串自己给自己追加,如何?不能,可能会 非法访问

模拟实现:

//模拟实现strcat
char* my_strcat(char* dest, const char* src)
{
	assert(dest&&src);
	char* ret = dest;
	while (*dest != '\0')
		dest++;
	char* sr = src;
	while (*dest++ = *sr++);
	return ret;
}

        4.strcmp

函数原型:

注意事项:

1.This function starts comparing the first character of each string. If they are equal to each
other, it continues with the following pairs until the characters differ or until a terminating
null-character is reached.
标准规定:
1.第一个字符串大于第二个字符串,则返回 大于0 的数字
2.第一个字符串等于第二个字符串,则返回 0
3.第一个字符串小于第二个字符串,则返回 小于0 的数字

模拟实现:

//模拟实现strcmp
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 < *str2)
		return -1;
	else
		return 1;
}

        5.strncpy

函数原型:

注意事项:

1.Copies the first num characters of source to destination. If the end of the source C string
(which is signaled by a null-character) is found before num characters have been copied,
destination is padded with zeros until a total of num characters have been written to it.
2.拷贝 num个字符 字符串到 目标空间
3.如果源字符串的长度 小于num ,则拷贝完源字符串之后,在目标的后边 追加0 ,直到 num

 简单使用;

//使用strncpy
int main()
{
	char buf[128] = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
	char* str = "abcdef";
	printf("%s\n", strncpy(buf, str,7 ));//没有超过就是n为多大就拷贝几个过去,
									//n如果超过了字符串的长度后面就进行补 '\0'

	return 0;
}

执行结果:

        6.strncat

函数原型:

注意事项:

1.Appends the first num characters of source to destination, plus a terminating null-character.
2.If the length of the C string in source is less than num, only the content up to the terminating null-character is copied
3.如果 空间 不够,要报错
4.如果num比源字符串长,则紧追加 NULL之前 的字符

简单使用:

//使用strncat
int main()
{
	char buf[128]="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
	buf[10] = '\0';		//从第一个'\0'开始拼接
	buf[20] = '\0';
	char* str = "abcdef";

	printf("%s", strncat(buf, str, 5));
	return 0;
}

执行结果:

        7.strncmp

函数原型:

注意事项:

比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

简单使用:

/* strncmp example */
int main()
{
	char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
	int n;
	puts("Looking for R2 astromech droids...");
	for (n = 0; n < 3; n++)
		if (strncmp(str[n], "R2xx", 2) == 0)
		{
			printf("found %s\n", str[n]);
		}
	return 0;
}

 执行结果:

        8.strstr

函数原型:

注意事项:

Returns a poin ter to the first occurrence of str2 in str1, or a null pointer if str2 is not part of
str1.

模拟实现:

//strstr的模拟实现
char* my_strstr(const char* str1, const char* str2)
{

	while (*str1)
	{
		if (*str1 == *str2)
		{
			char* s1 = str1; char* s2 = str2;
			while (*s1 && *s2 && (*s1 == *s2))
			{
				s1++;
				s2++;
			}
			if (*s2 == '\0')
				return str1;
		}
		str1++;
	}
}

        9.strtok

函数原型:

注意事项:

1.sep 参数是个字符串,定义了用作 分隔符的字符集合
2.第一个参数指定一个字符串,它包含了 0个或者多个由sep字符串中一个或者多个分隔符 分割的标记。
3.strtok 函数 找到str中的下一个标记 ,并将其用 \0 结尾 ,返回一个指向这个 标记的指针
(注strtok函数会 改变被操作的字符串 ,所以在使用 strtok 函数切分的字符串一般都是 临时拷贝的内容并且可修改 。)
4.strtok 函数的 第一个参数不为 NULL ,函数将找到 str 中第一个标记, strtok 函数将 保存它在字符串中的位置
5.strtok 函数的 第一个参数为 NULL ,函数将在同一个字符串中被 保存的位置开始 ,查找下一个标记。
6.如果字符串中 不存在更多的标记 ,则 返回 NULL 指针

简单使用:

//strtok使用
int main()
{
	char str[128] = "hyd@qwer.com.cn.edu.com";//注意这里必须是可修改的字符串,常量不能修改
	char* sep = "@.";
	char* ret = strtok(str, "@.");
	printf("%s\n", ret);
	while(ret=strtok(NULL,sep))
		printf("%s\n", ret);

	return 0;
}

执行结果:

        10.strerror

函数原型:

注意事项:

返回错误码(errno),所对应的错误信息。

简单使用:

//使用strerror
int main()
{
	FILE* fp = fopen("data.txt", "r");
	if (fp == NULL)
	{
		//printf("打开失败:%s\n", strerror(errno));//打印错误信息
		perror("打开失败");//类似于 printf+错误原因
	}
	else
		printf("文件打开成功\n");
	return 0;
}

执行结果:

        11.字符函数 

函数 如果他的参数符合下列条件就返回真(非0)
iscntrl         任何控制字符(1-31是控制字符,32-127是可打印字符)
isspace      空白字符:空格‘ ’,换页 ‘\f’ ,换行 '\n' ,回车 ‘\r’ ,制表符 '\t' 或者垂直制表符 '\v'
isdigit         十进制数字 0~9
isxdigit       十六进制数字,包括所有十进制数字,小写字母a~f,大写字母 A~F
islower       小写字母a~z
isupper      大写字母A~Z
isalpha       字母a~z A~Z
isalnum      字母或者数字,a~z,A~Z,0~9
ispunct       标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph       任何图形字符
isprint         任何可打印字符,包括图形字符和空白字符

        12. 字符转换函数

int tolower ( int c );
int toupper  ( int c );

简单使用:

/* isupper example */
#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
 {
    c=str[i];
    if (isupper(c)) 
        c=tolower(c);
    putchar (c);
    i++;
 }
  return 0;
}

 执行结果:

Ⅱ、内存函数

         1 .memcpy

函数原型:

注意事项:

1.函数 memcpy source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置。
2.这个函数在遇到 '\0' 的时候并不会停下来。
3.如果 source destination 有任何的重叠,复制的结果都是未定义的。

模拟实现:

//模拟实现memcpy
char* my_memcpy(void* dest, const void* src,size_t sz)
{
	assert(dest && src);
	char* ret = dest;
	while (sz--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

        2.memmove

函数原型:

注意事项:

1.和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。

模拟实现:

//char* my_memmove(void* dest, const void* src, size_t sz)
{
	assert(dest && src);
	char* ret = (char*)dest;
	if (dest < src)
	{
		while(sz--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (sz--)
		{
			*((char*)dest + sz) = *((char*)src + sz);
		}
	}
}

        3.memcmp

函数原型:

注意事项;

1.比较从 ptr1 ptr2 指针开始的 num 个字节
2.返回值如下:

简单使用:

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00
	//
	int arr2[] = { 1,2,3,0x11223304 };
	//01 00 00 00 02 00 00 00 03 00 00 00 04 33 22 11
	int ret = memcmp(arr1, arr2, 13);
	printf("%d\n", ret);

	return 0;
}

执行结果:

        4.memset 

函数原型:

注意事项:

字节为单位设置内存的

简单使用:

int main()
{
	char arr[] = "hello world";
	memset(arr+6, 'x', 3);
	printf("%s\n", arr);

//	int arr[10] = { 0 };
//	memset(arr, 0, 40);

	return 0;
}

执行结果:hello xxxld

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

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

相关文章

Java热门技术点总结:Lambda表达式与Stream API

第一部分&#xff1a;Lambda表达式 1. 简介 Lambda表达式是Java 8引入的一个非常重要的特性&#xff0c;它提供了一种简洁、灵活的函数式编程方式。Lambda表达式允许我们将函数作为参数传递&#xff0c;极大的简化了代码的编写。 2. 基本语法 Lambda表达式的基本语法如下&a…

聚类模型的算法性能评价

一、概述 作为机器学习领域的重要内容之一&#xff0c;聚类模型在许多方面能够发挥举足轻重的作用。所谓聚类&#xff0c;就是通过一定的技术方法将一堆数据样本依照其特性划分为不同的簇类&#xff0c;使得同一个簇内的样本有着更相近的属性。依不同的实现策略&#xff0c;聚类…

目标检测之YoloV1

一、预测阶段&#xff08;前向推断&#xff09; 在预测阶段Yolo就相当于一个黑箱子&#xff0c;输入的是448*448*3的图像&#xff0c;输出是7*7*30的张量&#xff0c;包含了所有预测框的坐标、置信度和类别 为什么是7*7*30呢&#xff1f; --将输入图像划分成s*s个grid cell&a…

stm32 No traget connected/debug识别不到串口的问题

关于stm32串口识别不到&#xff0c;第一步先确定是否线接错&#xff08;stlink与stm32接口对应&#xff09;&#xff0c;如果确认接线没有问题的话&#xff0c;可以使用以下方法&#xff0c;成功率较高。 首先将stlink的boot0置1&#xff0c;就是把跳线帽换到高电平这一侧&…

专业技术!最新氧化物异质结纳米制备技术

网盘 https://pan.baidu.com/s/1vjO2yLxm638YpnqDQmX7-g?pwd3at5 MOF衍生的B_A_B结构氧化物异质结及其制备方法和应用.pdf 二硫化钼-硫化镉纳米复合材料及其制备方法和应用.pdf 具有异质界面的耐辐照复合薄膜及其制备方法与应用.pdf 基于异质结双界面层纳米材料的复合介电薄膜…

基于单片机和LabVIEW 的远程矿井水位监控系统设计

摘要 &#xff1a; 针 对 现 有 矿 井 水 位 监 控 系 统 存 在 结 构 复 杂 和 不 能 远 程 监 控 的 问 题 &#xff0c; 设计了基于单片机和&#xff2c;&#xff41;&#xff42;&#xff36;&#xff29;&#xff25;&#xff37; 的远程矿井水位监控系统 &#xff0c; 详…

获取当前操作系统的名称platform.system()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 获取当前操作系统的名称 platform.system() [太阳]选择题 在Python中&#xff0c;platform.system() 函数被用来获取什么信息&#xff1f; import platform print("【执行】platform.s…

Python数据分析第二课:conda的基础命令

Python数据分析第二课&#xff1a;conda的基础命令 1.conda是什么? conda是一个开源的包管理系统&#xff0c;可以帮助我们进行管理多个不同版本的软件包&#xff0c;还可以帮助我们建立虚拟环境&#xff0c;以便对不同的项目进行隔离。 简单来说&#xff0c;conda是一个软…

充电站,正在杀死加油站

最近&#xff0c;深圳公布了一组数据&#xff0c;深圳的超级充电站数量已超过传统加油站数量&#xff0c;充电枪数量也已超过加油枪数量。 从全国范围看&#xff0c;加油站关停的速度在加快。 充电站正在杀死加油站。 加油站&#xff0c;未来何去何从&#xff1f; 01. 减少 我…

概率论论文(关于“到课率”的贝叶斯推理应用)

概率论论文(关于“到课率”的贝叶斯推理应用) 全条件概率公式和贝叶斯公式趣味识 思考1&#xff1a; (引自贝叶斯公式及朴素贝叶斯分类算法应用初探) “狼来了”的故事想必大家都知道&#xff0c;小孩子第三次对村民说狼来了的时候&#xff0c;村民们没有相信他的话&#xff0…

windows 10 通过wsl安装ubuntu子系统教程

本章教程,主要记录我昨天通过Windows10 wsl安装Ubuntu的安装过程。其中遇到很多问题。 一、确定是否满足条件 系统要求操作系统版本: 需要 Windows 10 版本 1903 或更高版本,且操作系统内部版本号为 18362 或更高。 建议使用最新版本的 Windows 10 以获得最佳性能和最新功能…

VUE项目安全漏洞扫描和修复

npm audit 1、npm audit是npm 6 新增的一个命令,可以允许开发人员分析复杂的代码并查明特定的漏洞。 2、npm audit名称执行&#xff0c;需要包package.json和package-lock.json文件。它是通过分析 package-lock.json 文件&#xff0c;继而扫描我们的包分析是否包含漏洞的。 …

AI数据分析007:根据Excel表格数据绘制柱形图

文章目录 一、介绍二、输入内容三、输出内容一、介绍 将Excel文件中2013年至2019年间线上图书的销售额,以条形图的形式呈现,每个条形的高度代表相应年份的销售额,同时在每个条形上方标注具体的销售额数值 二、输入内容 在deepseek中输入提示词: 你是一个Python编程专家,…

【PostgreSQL】守护数据安全:事务与数据完整性管理

目录 事务管理&#xff1a;确保操作的原子性 事务的概念与重要性 事务的启动与提交 事务的回滚&#xff08;ROLLBACK&#xff09;&#xff08; 数据一致性与隔离级别 隔离级别的解释 设置隔离级别 错误处理与事务的高级策略 异常处理&#xff08;SAVEPOINT & EXCE…

算法刷题日志 —— 数组和位运算

文章目录 [461. 汉明距离](https://leetcode.cn/problems/hamming-distance/submissions/542447020/)[448. 找到所有数组中消失的数字](https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array/submissions/)[136. 只出现一次的数字](https://leetcode.cn/pro…

C# 超简单的离线人脸识别库 - ViewFaceCore

项目介绍 ViewFaceCore是一个基于 SeetaFace6 的 .NET 人脸识别解决方案。 项目特点 开源&#xff08;MIT license&#xff09;、免费、简单的离线人脸识别库。 跨平台&#xff08;适用于 Windows、MacOS 和 Linux &#xff09;。 .NET 框架 和 操作系统 封装完善的NuGet包…

openssl 命令行生成密钥对,生成hash,PSS填充签名,校验

生成密钥对(RSA4096) openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096 openssl rsa -pubout -in private_key.pem -out public_key.pem将源文件data.txt生成hash值&#xff08;sha-256&#xff09; openssl dgst -sha256 -binary data.t…

数字黄金 vs 全球计算机:比特币与以太坊现货 ETF 对比

撰文&#xff1a;Andrew Kang 编译&#xff1a;J1N&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News 比特币现货 ETF 的通过为许多新买家打开了进入加密货币市场的大门&#xff0c;让他们可以在投资组合中配置比特币。但以太坊现货 ETF 的通过&#xf…

YOLOv8改进 | 注意力机制 | 迈向高质量像素级回归的极化自注意力【全网独家】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有…

kafka consumer客户端消费逻辑解析

kafka consumer客户端消费逻辑解析 一、主要消费步骤二、提交策略【步骤2代码解析】【提交策略总结】 三、拉取策略&#xff08;待补充&#xff09;四、消费策略【代码解析】【消费策略总结】 一、主要消费步骤 这是kafka客户端拉取消息的入口&#xff0c;有4个主要部分 1、启…