C语言——常用库函数的使用及模拟实现

news2024/10/12 2:19:55

C语言编译系统为使用者提供了很多的预定义库函数。用户在编写程序时,可以直接调用这些库函数。这里选择了一些常用的库函数,简单介绍各个函数的使用方法:

字符串函数

字符串函数函数分为长度不受限制的字符串函数,和长度受限制的字符串函数。

长度不受限制的字符串函数包括strcpy函数、strcat函数、strcmp函数等等,这类函数不关注'\0'的位置

长度受限制的字符串函数包括strncpy函数、strncat函数、strncmp函数等等

strlen函数

size_t strlen(const char* str);

strlen函数用来计算字符个数,需包含头文件#include<string.h>

  • 字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前出现的字符个数(不包括'\0')
  • 参数指向的字符串必须要以'\0'结束,否则没有'\0',函数会一直向后寻找
  • 注意:strlen函数的返回值size_t是无符号的
#include<string.h>
#include<stdio.h>
int main()
{
	if (strlen("abc") - strlen("abcdef") > 0)
	{
		printf("大于\n");
	}
	else
	{
		printf("小于等于\n");
	}
	//结果为:大于
	//因为strlen函数参数的返回值是无符号的
	return 0;
}

strcpy函数

strcpy函数是将源字符串复制到目标空间中去,需包含头文件#include<string.h>

char* strcpy(char* destination,const char* source)
  • 源字符串必须以'\0'结束
  • 该函数会将源字符串中的'\0'拷贝到目标空间
  • 目标空间必须足够大,以确保能够存放源字符串
  • 目标空间必须可变
#include<string.h>
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "helle world";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strncpy函数

需要包含头文件#include<string.h>

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "*******";
	strncpy(arr1, arr2, 5);
	printf("%s\n", arr1); //*****f
	return 0;
}

strcat函数

char* strcat(char* destnation,const char* source)

strcat函数用来连接两个字符串,需包含头文件#include<string.h>

  • 目标空间必须足够大,能够容纳源字符串的内容
  • 目标空间可修改
  • 注意:不能自己连接自己
int main()
{
	char arr1[20] = "hello";
	char arr2[] = " world";
	strcat(arr1, arr2);
	printf("%s\n", arr1); //hello world
	return 0;
}

strncat函数

需要包含头文件#include<string.h>

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "*******";
	strncat(arr1, arr2, 5);
	printf("%s\n", arr1);//abcdef*****
	return 0;
}

strcmp函数

需要包含头文件#include<string.h>

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

标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字
int main()
{
	char str1[] = "abc";
	char str2[] = "bbc";
	int ret = strcmp(str1, str2);
	printf("%d", ret);  //-1
	return 0;
}

strncmp函数

需要包含头文件#include<string.h>

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "abccsfsv";
	int ret = strncmp(arr1, arr2, 6);
	printf("%d\n", ret); //1
	return 0;
}

strstr函数

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

该函数用来在字符串中找子字符串(找第一次出现的位置),需要包含头文件#include<string.h>

int main()
{
	char arr1[] = "abcdefacbdef";
	char arr2[] = "def";
	char* ret = strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}

strtok函数

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

需要包含头文件#include<string.h> 

  1. sep参数是个字符串,定义了用作分隔符的字符集合
  2. 第一个参数指定一个字符串,它包含了0个或多个由sep字符中一个或多个分隔符分割的标记
  3. strtok函数找到str中的下一个标记,并将其用'\0'结束,返回一个指向这个标记的指针(注意:strtok函数会改变被操作符的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容,且可修改)
  • strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存标记的位置开始,查找下一个标记
  • 如果字符串中不存在更多的标记,则返回NULL指针
int main()
{
	char arr[] = "cnlSDNlNv@kdlsn.sjnk";
	char copy[50];
	strcpy(copy, arr);

	char sep[] = "@.";
	char* ret = NULL;

	for (ret = strtok(copy, sep); ret != NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);
	}
//输出为:
//cnlSDNlNv
//kdlsn
//sjnk
	return 0;
}

 strerror函数

char* strerror(int errnum);

该函数返回错误码所对应的错误信息,需包含头文件#include<errno.h>和#include<string.h>

库函数在执行的时候发生了错误,会将一个错误码存放在errno这个变量中,errno是C语言提供的一个全局变量

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d:%s\n", i, strerror(i));
	}
	return 0;
}

 字符分类函数

需要包含头文件#include<ctype.h>

函数

如果它的参数符合下列条件就返回真

iscntrl

任何控制字符

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任何可打印字符,包括图形字符和空白字符

ASCII码表中,不可打印的部分为0~31和127

 内存函数

memcpy函数

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

需要包含头文件#include<string.h> 

  • 函数memcpy从source的位置开始向后赋值num个字节的数据到destination的内存位置
  • 该函数遇到'\0'不会停下来
  • 如果source和destination的空间有任何重叠,复制的结果都是未定义的
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	memcpy(arr2, arr1, 40); //40个字节
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

memmove函数

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

需要包含头文件#include<string.h> 

该函数和memcpy函数的区别就在于:memmove函数处理的源内存和目标内存是可以重叠的

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1 + 2, arr1, 20);//memmove函数可以用来处理重叠的内存拷贝的
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);  
	}
	return 0;
}

最后向大家分享一个网站,可以自行查阅更多库函数的使用方法

https://cplusplus.com/reference/

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

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

相关文章

图的应用解析

01&#xff0e;任何一个无向连通图的最小生成树(B )。 A.有一棵或多棵 B.只有一棵 C.一定有多棵 D.可能不存在 02.用Prim算法和Kruskal算法构造图的最小生成树&#xff0c…

每日一题————P5725 【深基4.习8】求三角形

题目&#xff1a; 题目乍一看非常的简单&#xff0c;属于初学者都会的问题——————————但是实际上呢&#xff0c;有一些小小的坑在里面。 就是三角形的打印。 平常我们在写代码的时候&#xff0c;遇到打印三角形的题&#xff0c;一般简简单单两个for循环搞定 #inclu…

Element-Plus日期选择组件封装农历日期

背景 在使用element-plus开发项目过程中&#xff0c;需要填入人员的生卒日期&#xff0c;经观察&#xff0c;对于大部分人来说&#xff0c;这类日期通常是农历日期&#xff0c;然而我们在系统建设过程中&#xff0c;对于日期字段&#xff0c;约定成俗的都会使用公历日期&#…

机器学习的模型校准

背景知识 之前一直没了解过模型校准是什么东西&#xff0c;最近上班业务需要看了一下&#xff1a; 模型校准是指对分类模型进行修正以提高其概率预测的准确性。在分类模型中&#xff0c;预测结果通常以类别标签形式呈现&#xff08;例如&#xff0c;0或1&#xff09;&#xf…

day03-Docker

1.初识 Docker 1.1.什么是 Docker 1.1.1.应用部署的环境问题 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 例如一个项目中&#xff0c;部署时需要依…

拯救者Legion R9000X 2021(82HN)原装出厂Win10系统镜像ISO下载

lenovo联想拯救者笔记本R9000X 2021款原厂Windows10系统安装包&#xff0c;恢复出厂开箱状态预装OEM系统 链接&#xff1a;https://pan.baidu.com/s/1tx_ghh6k0Y9vXBz-7FEQng?pwd7mih 提取码&#xff1a;7mih 原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标…

C++核心编程——4.2(2)对象的初始化和清理

4.2.5 深拷贝与浅拷贝 浅拷贝&#xff1a;编译器提供的简单的赋值拷贝操作 深拷贝&#xff1a;在堆区重新申请空间&#xff0c;进行拷贝操作 示例&#xff1a; class Person { public://无参&#xff08;默认&#xff09;构造函数Person() {cout << "无参构造函数…

并发编程之线程池的应用以及一些小细节的详细解析

线程池在实际中的使用 实际开发中&#xff0c;最常用主要还是利用ThreadPoolExecutor自定义线程池&#xff0c;可以给出一些关键的参数来自定义。 在下面的代码中可以看到&#xff0c;该线程池的最大并行线程数是5&#xff0c;线程等候区&#xff08;阻塞队列)是3&#xff0c;即…

基于Python的微博旅游情感分析、微博舆论可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

JAVAEE之Cookie/Session

1.Cookie HTTP 协议自身是属于 "无状态" 协议. "无状态" 的含义指的是: 默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后, 第二…

绩效考核存在合理性、公平性、客观性吗?

目录 一、绩效考核流于形式&#xff1a;没有实际考核过 二、考核结果的确定: 主管一人说了算 三、考核结果&#xff1a; 与绩效奖金挂钩吗&#xff1f; 四、考核的滥用&#xff1a;成为公司排挤迫使员工离职的手段 五、公司说&#xff1a; 让你滚蛋&#xff0c;谁还会发你奖…

[HackMyVM]靶场Boxing

难度:Medium kali:192.168.56.104 靶机:192.168.56.143 端口扫描 ┌──(root㉿kali2)-[~/Desktop] └─# nmap 192.168.56.143 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-03 19:25 CST Nmap scan report for staging-env.boxing.hmv (192.168.56.143) Host …

智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案

一、建设背景 随着科技的不断进步和社会安全需求的日益增长&#xff0c;展览馆作为展示文化、艺术和科技成果的重要场所&#xff0c;其安全监控系统的智能化升级已成为当务之急。为此&#xff0c;旭帆科技&#xff08;TSINGSEE青犀&#xff09;基于视频智能分析技术推出了展览馆…

路径规划——曲线拟合详解(一):多项式轨迹与QP优化(minimum-snap算法核心部分)

前言 历经一个多星期时间&#xff0c;我们在路径规划——搜索算法部分讲解了7种常见的路径搜索算法&#xff0c;每一种算法的链接放在下面了&#xff0c;有需要的朋友点击跳转即可&#xff1a; 路径规划——搜索算法详解&#xff08;一&#xff09;&#xff1a;Dijkstra算法详…

redis之穿透、击穿、雪崩

目录 缓存雪崩 问题描述 缓存雪崩 问题描述 key 对应的数据存在&#xff0c;但在 redis 中过期&#xff0c;此时若有大量并发请求过来&#xff0c;这些请求发现缓存过期一般都会从后端数据库加载数据并回设到缓存&#xff0c;这个时候大并发的请求可能会瞬间把后端数据库压垮。…

GPTfinger赋能指纹识别技术,德施曼赢下这一局

生成式AI这场战局里&#xff0c;德施曼跑赢同行&#xff0c;成为行业里第一个引入GPT技术的智能锁厂商。 4月2日&#xff0c;德施曼智能锁在北京举办了新品发布会之前的“创新技术预沟通会”&#xff0c;向到场媒体揭晓了最新技术突破之一——GPTfinger。 「智哪儿」认为&…

关闭PyCharm中因双击Shift而跳出的搜索框

有时候老是多次按到shift而跳出一个搜索框&#xff0c;本来在编写代码&#xff0c;怎么突然就开始搜索了&#xff0c;非常的烦人。 其实这个搜索框叫做“随处搜索”。 关闭步骤 1、打开PyCharm的设置。 2、在设置-高级设置中勾选-禁用双击修改键快捷键即可。

4.3学习总结

[HNCTF 2022 WEEK2]Canyource&#xff08;无参数&#xff09; 通过这题又接触了一种无参数RCE的方法&#xff0c;前面学习的getallheaders只有在apache环境下才能使用&#xff0c;具有一定的局限性 这里是利用php函数来构造读取flag的方法 localeconv() – 函数返回一个包含本…

Ribbon有哪些负载均衡策略

负载均衡类都实现了IRule接口。 RandomRule&#xff1a;随机的选用一个实例 RoundRobinRule&#xff1a;轮询的使用实例 RetryRule&#xff1a;在轮询的基础上加了一个错误重试机制&#xff0c;在deadline时间内会不断的重试 WeightResponeTimeRule&#xff1a;根据权重去做…

Golang 开发实战day07 - Functions

Golang 教程07 - Functions 1. Functions 1.1 什么是函数&#xff1f; 在 Golang 中&#xff0c;函数就像是代码的超级组合体&#xff0c;可以将一段代码封装成一个独立的单元&#xff0c;以便重复使用。 1.2 函数声明 func funcName(parameter1 type1, parameter2 type2)…