字符操作函数和内存操作函数

news2025/2/23 3:52:54

1 字符操作函数

1.strlen

size_t strlen ( const char * str );

函数功能:返回以'\0'结尾的字符串长度,不包含'\0'。

注:strlen返回值是一个无符号整数size_t。

#include <stdio.h>

int main()
{
 const char*str1 = "abcdef";
 const char*str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf("str2>str1\n");
 } 
 else

 {
 printf("srt1>str2\n");
 }
 return 0;
}

2.strcpy

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

函数功能:将源字符串以“\0”结束的字符串拷贝到目标地址中。

函数参数:char * destination:目标地址。const char * source:源地址。

注:目标地址的空间必须可变,不能是const修饰的常量字符串。源地址字符串以“\0”作为结束标志。

3.strcat

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

函数功能:在目标字符串后面追加源字符串

函数参数:char * destination:目标字符串。const char * source:源字符串。

注:目标空间必须可变且要足够大。

int main()
{
	char str1[30] = "abcdef";
	char* str2 = "bbb";
	strcat(str1, str2);
	printf("%s",str1);
	return 0;
}

3.strcmp

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

函数功能:比较两个字符串大小。

函数参数:const char * str1:字符串1。const char * str2:字符串2。

规定标准:当str1和str2字符串完全相等时返回0。当str1>str2字符串时返回值>0。当str1<str2时返回值<0。

4.strncpy

char * strncpy ( char * destination, const char * source, size_t num );

函数功能:将源地址中的字符串从首地址开始的num个字符拷贝到以目标地址为首地址的字符串

函数参数:char * destination:目标地址。const char * source:源地址。size_t num:字符个数。

注:如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

int main()
{
	char str1[10];
	char* str2 = "abc";
	strncpy(str1, str2, 8);
	printf("%s",str1);
	return 0;
}

5. strncat

char * strncat ( char * destination, const char * source, size_t num );

函数功能:目标地址字符串末尾追加num个源地址的字符。

函数参数:char * destination:目标地址。const char * source:源地址。size_t num:字符个数。

#include <stdio.h>
#include <string.h>
int main ()
{
 char str1[20];
 char str2[20];
 strcpy (str1,"To be ");
 strcpy (str2,"or not to be");
 strncat (str1, str2, 6);
 puts (str1);
 return 0;
}

6.strncmp

int strncmp ( const char * str1, const char * str2, size_t num );

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

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;
}

7.strstr

char * strstr ( const char *, const char * );

函数功能:在一个字符串中找另一个字符串的子串。

函数返回值:如果包含另一个字符串的子串则返回包含字符串内找到的字符串首地址。没找到返回NULL。

int main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = strstr(str, "simple");
	puts(pch);
	return 0;
}

8.strtok

char * strtok ( char * str, const char * sep );

函数功能:按给出的分割符号分割字符串。

函数参数:char * str:字符串首地址,包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。const char * sep:分隔符的集合。

过程:strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改 变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。 如果字符串中不存在更多的标记,则返回 NULL 指针。

int main()
{
	char str[] = "- This, a sample string.";
	char* pch;
	printf("Splitting string \"%s\" into tokens:\n", str);
	pch = strtok(str, " ,.-");
	while (pch != NULL)
	{
		printf("%s\n", pch);
		pch = strtok(NULL, " ,.-");
	}
	return 0;
}

9.strerror

char * strerror ( int errnum );

函数功能:返回错误码所对应的错误信息。

#include <stdio.h> 
#include <string.h> 
#include <errno.h>//必须包含的头文件 
int main () 
{ 
 FILE * pFile; 
 pFile = fopen ("unexist.ent","r"); 
 if (pFile == NULL) 
 printf ("Error opening file unexist.ent: %s\n",strerror(errno)); 
 //errno: Last error number 
 return 0; 
} 

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘ \f ’,换行‘ \n ’,回车‘ \r ’,制表符‘ \t ’,或者垂直制表‘ \v ’ 。
isdigit十进制数字1~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任何可打印字符,包括图形字符和空白字符

字符转换:

int tolower ( int c );//参数c转小写

int toupper ( int c );  //参数c转大写

2 内存操作函数

1.memcpy

void * memcpy ( void * destination, const void * source, size_t num );

函数功能:函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

函数参数:void * destination:目标地址。const void * source:源地址。size_t num:操作字节数。

注:这个函数在遇到 '\0' 的时候并不会停下来。 如果source和destination有任何的重叠,复制的结果都是未定义的。

2.memmove

void * memmove ( void * destination, const void * source, size_t num );

函数功能:与memcpy类似,和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

函数参数:void * destination:目标地址。const void * source:源地址。size_t num:操作字节数。

注:如果源空间和目标空间出现重叠,就得使用memmove函数处理。

#include <stdio.h> 
#include <string.h> 
 
int main () 
{ 
 char str[] = "memmove can be very useful......"; 
 memmove (str+20,str+15,11); 
 puts (str); 
 return 0; 
}

3.memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

函数功能:比较从ptr1和ptr2指针开始的num个字节。

函数参数:const void * ptr1:字符串1。const void * ptr2:字符串2。

规定标准:当ptr1和ptr2字符串完全相等时返回0。当ptr1>ptr2字符串时返回值>0。当ptr1<ptr2时返回值<0。

3 部分函数模拟实现

1.strlen

//计数器版本
int my_strlen1(const char* str)
{
	int count = 0;
	assert(str);
	while (*str++)
	{
		count++;
	}
	return count;
}
//递归版本
int my_strlen2(const char* str)
{
	if (*str != '\0')
	{
	return my_strlen2(++str)+1;
	}
	return 0;
}

 

2.strcpy 

char* my_strcpy(char* str1, char* str2)
{
	char* p = str1;
	while (*str1++ = *str2++)
	{
		;
	}
	return p;
}

 3.strcat

char* my_strcat(char* str1, char* str2)
{
	while (*str1!= '\0')
	{
		str1++;
	}
	while (*str1++ = *str2++)
	{
		;
	}
}

4. strstr

char* my_strstr(char* str1, char* str2)
{
	char* str1_p = str1;
	char* str2_p = str2;
	while (*str2_p != '\0')
	{
		if (*str2_p == *str1_p)
		{
			str2_p++;
			str1_p++;
		}
		else
		{
			str2_p = str2;
            str1_p = str1;
			str1++;
		}
	}
	return str1;
}

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

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

相关文章

Linux基础软件-selinux库文件swap

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux进阶部分又分了很多小的部分,我们刚讲完了Linux日常运维。讲的那些东西都算是系统自带的&#xff0c;但是Linux作为一个…

LVGL 控件之圆弧(lv_arc)

目录 一、圆弧部件1、部件组成2、lv_art_t3、圆弧部件角度设置4、圆弧部件旋转设置5、圆弧的模式选择6、圆弧部件的变化率设置7、移除旋钮8、事件9、获取/设置信息相关的 API 二、例程 一、圆弧部件 1、部件组成 圆弧&#xff08;lv_arc&#xff09;部件由三个部分组成&#…

学习之SQL语言之DDL

查询 查询所有数据 SHOW DATABASES&#xff1b; 查询当前数据库 SELECT DATABASE(); 创建 CREATE DATABASE IF NOT EXISTS 数据库名&#xff1b; 删除 DROP DATABASE IF EXISTS 数据库名&#xff1b; 使用 USE 数据库名&#xff1b; 查询当前数据库所有表 SHOW TABLES; 查…

优化大型语言模型微调:MoLA层级专家分配策略

人工智能咨询培训老师叶梓 转载标明出处 大模型&#xff08;LLMs&#xff09;的微调过程中&#xff0c;计算资源的需求巨大&#xff0c;这促使研究者们探索参数高效微调&#xff08;PEFT&#xff09;技术。低秩适应&#xff08;LoRA&#xff09;和专家混合模型&#xff08;MoE…

超分 Real-ESRGAN 使用笔记

效果图 目录 依赖项: 视频推理入口: 图片推理入口文件: RealESRGAN_x4plus 12g显存不够 RealESRGAN_x4plus_anime_6B 的效果 树枝之间产生了蒙版 RealESRNet_x4plus 有点模糊 2022年开源的 GitHub - xinntao/Real-ESRGAN: Real-ESRGAN aims at developing Practical…

操作系统 --王道计算机考研--学习笔记

文章目录 前言第一章 引言1.1 什么是操作系统&#xff1f;1 操作系统作为虚拟机2 操作系统作为资源管理者3 为上层提供服务-- 系统调用 2.操作系统特征与发展分类2.1 操作系统特征1.并发2.共享3.虚拟4.异步 2.2 操作系统发展和分类 3.操作系统的的运行机制和中断异常、系统调用…

vue脚手架的创建

一、安装node环境 切换阿里云镜像 npm config set registry https://registry.npm.taobao.org 2、全局安装vue-cli和webpack 已经安装过node.js之后和淘宝镜像的话&#xff0c;vue的运行环境基本上就搭建好了&#xff0c;只需再安装全局的webpack&#xff08;命令行&#…

【大模型理论篇】RoPE旋转位置编码底层数学原理分析

1. 位置编码对于NLP模型的作用 位置编码&#xff08;Positional Encoding&#xff09;在大模型&#xff08;例如Transformer架构&#xff09;中起到了非常重要的作用。没有位置编码的信息&#xff0c;模型会丧失序列的顺序信息&#xff0c;导致模型退化成一个简单的“词…

物品租赁​​​​​​​|基于SprinBoot+vue的物品租赁​​​​​​​系统(源码+数据库+文档)

物品租赁系统 基于SprinBootvue的物品租赁系统 一、前言 二、系统设计 三、系统功能设计 5.1 系统功能模块 5.2 管理员功能模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

【单片机原理及应用】实验:数码管的中断控制

目录 一、实验目的 二、实验内容 三、实验步骤 四、记录与处理 五、思考 六、成果文件提取链接 一、实验目的 掌握外部中断的工作原理&#xff0c;学习中断编程与程序调试方法。 二、实验内容 【参照图表】 &#xff08;1&#xff09;创建一个包含80C51固件&#xff0c;采用…

汽车乘客热舒适度大挑战,如何利用仿真技术提高汽车环境舒适度

舒适性在人们选择汽车的决定性方面占比越来越重&#xff0c;而汽车乘员舱环境的舒适性是指为乘员提供舒适愉快便利的乘坐环境与条件&#xff0c;包括良好的平顺性、车内的低噪声、适宜的空气环境以及良好的驾驶操作性能。 舒适性 经济性 安全性、动力性 典型的乘员舱热舒适性模…

git常见命令行及分支规范

文章目录 GIT常见命令行原理图基本设置初始化和克隆仓库文件管理提交更改查看状态和历史分支管理远程仓库交互高级功能GIT常见分支风格1. 单一主干分支(Single Main Branch)//极少使用优点:缺点:2. 多主干分支(Multiple Main Branches)//个人小型项目采用优点:缺点:3. …

OpenCV Jet颜色映射和HSV颜色空间对比

目录 一、概述 二、Jet颜色空间映射 2.1优势 2.2颜色变化范围 2.3应用场景 三、HSV 颜色空间 3.1优势 3.2颜色分布 3.3应用场景 四、Jet与HSV区别 4.1对比总结 4.2选择建议 OpenCV图像处理与应用实战算法汇总地址&#xff1a; OpenCV 图像处理应用实战算法列表汇总…

H264编码原理(二)帧内预测

假设你去了一家餐厅吃饭&#xff0c;这家餐厅提供了一个有趣的点餐方式。服务员会根据餐厅最近最受欢迎的菜品组合&#xff0c;推荐九个套餐给你。你的任务是从这九个套餐中找到一个最接近你心中想要的菜品组合的套餐&#xff0c;然后告诉服务员你想替换哪些菜&#xff0c;以得…

PS快速如何抠图章?

1、选择--色彩范围--颜色选择(反相)--确定 2、选中范围后--按delete删除非选中内容--就能得到图章 3、图层叠加来加深颜色和补全缺失点

合宙低功耗4G模组Air780EQ——开发板使用说明

CORE-AIR780E 开发板是合宙通信推出的基于 Air780E 模组所开发的&#xff0c; 包含电源&#xff0c;SIM 卡&#xff0c;USB&#xff0c;天线&#xff0c;音频等必要功能的最小硬件系统。 以方便用户在设计前期对Air780E模块 进行性能评估&#xff0c;功能调试&#xff0c;软件…

Python__面向对象__多态学习

目录 一、多态 1.多态定义理解 2.实例属性和类属性 3.类相关的函数 (1) 实例方法 (2)类方法 (3)静态方法 一、多态 1.多态定义理解 在Python中&#xff0c;多态是一种特性&#xff0c;类似于一个接口&#xff0c;允许在一个对象中的一个操作可作用在不同类型的对象上…

OpenGL3.3_C++_Windows(36)

PBR_IBL镜面部分 镜面部分并不能像漫反射部分一样将BRDF部分像常量一样提取出来&#xff0c;因为它整个积分上不是常数&#xff0c;因为它受到wi和w0的影响&#xff0c;就比如一个x的等式&#xff0c;不能把x部分提取出来一样&#xff0c;他是随着等式变化的如果试图解算所有入…

uni-app开发日志:将schema2code生成的新增页和修改页整合成一页

有没有想过&#xff0c;add和edit页面其实没多大差别&#xff1f; 我之前自研的系统add和edit都是一个页面&#xff0c;只要判断一下当前有没有id传递来&#xff0c;为空来就是新增。 这样如果页面修改时&#xff0c;才能尽量少改动代码&#xff0c;少出错。 对比add.vue和edit…

企业海外新闻稿发布的转型之路:从纸媒到数字化

在全球化进程加速的今天&#xff0c;企业的传播渠道和方式也在经历着深刻的变革。曾经占据主导地位的纸质媒体&#xff0c;逐渐被灵活高效的海外媒体网站所取代。企业新闻稿发布形式的转变&#xff0c;不仅体现了技术进步和媒体环境的变化&#xff0c;也标志着企业全球传播战略…