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

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/

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

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

相关文章

手搓链表(java)(不完整)

手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09; 文章目录 手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09;前言一、代码1.MyLinkedList类&#xff1a;2.测试类&#xff1a; 总结 前言 提示&#xff1a;以下是本篇文章正文内容&…

Git 术语及中英文对照

完毕&#xff01;&#xff01;感谢您的收看 ----------★★历史博文集合★★---------- 我的零基础Python教程&#xff0c;Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字…

保姆级教程——VLAN综合实验(不同VLAN通过动态路由访问外网)

前言&#xff1a; 部署了VLAN的传统交换机不能实现不同VLAN间的二层报文转发&#xff0c;因此必须引入路由技术来实现不同VLAN间的通信。VLAN路由可以通过二层交换机配合路由器来实现&#xff0c;也可以通过三层交换机来实现 VLAN间通信的限制 每个VLAN都是一个独立的…

vue 使用自定义标签URL Protocol 调用本地exe 并传参

创建注册表文件reg&#xff0c;并运行 里面的路径需要替换成实际exe的绝对路径 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\App] "URL:App Protocol Handler" "URL Protocol""" [HKEY_CLASSES_ROOT\App\DefaultIcon] &qu…

启动mysql

删除C:\Program Files (x86)\MySQL\MySQL Server 5.7这个路径下的data文件夹&#xff0c;这个很难删除&#xff0c;因为一开机&#xff0c;mysql的某些服务就启动了&#xff0c;每次重新启动mysql之前&#xff0c;都要删除这个文件夹 因为这个文件夹在后端执行一些我们看不到的…

pycharm打包python文件为exe文件(图文教程)

1.安装pyinstaller库 pip3 install pyinstaller 2.使用pyinstaller 打包文件 首先确保Terminal命令行中&#xff0c;你的路径和你的项目是同一个路径 我的项目就是放在golden_dev中的。 3.命令行内输入打包代码 pyinstaller -F -w gold_miner.py gold_miner.py 是我的项目…

HomePlug AV

目录 HomePlug AV的基本概念基本术语网络概念网络实例 HomePlug AV物理层&#xff08;PHY&#xff09;HomePlug AV OFDM收发器架构PHY的调制模式FC调制和ROBO调制物理层的特点OFDM频域/时域转换开窗/槽式OFDM信号和噪声PHY发送控制——信道自适应PHY帧格式&#xff08;Symbol&a…

微软邮箱被锁住,该如何解除限制?

ChatGPT账号是微软邮箱注册的&#xff0c;我们在登陆微软邮箱时&#xff0c;http://www.outlook.com&#xff0c;不需要开魔法工具&#xff0c;直接就可以登陆&#xff0c;否则会出现安全验证&#xff0c;限制登陆。 那么如果账号被锁&#xff0c;我们该如何解除限制呢&#x…

目标检测——监控下的汽车

一、重要性及意义 首先&#xff0c;车辆检测技术是保证视频监控系统正常运行的基础。通过监控摄像头实时获取的图像&#xff0c;可以自动检测出图像中的车辆&#xff0c;并进行车辆类型的分类和识别。这对于优化城市交通管理、实现智能交通系统具有重要意义。此外&#xff0c;…

【LeetCode热题100】51. N 皇后(回溯)

一.题目要求 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方…

渐进式图片解决前端在页面中使用大图,图片体积过大导致页面出现白屏现象

1、演示 可以看到&#xff0c;图片还在拼命加载的时候&#xff0c; 页面上就已经有内容了 2、什么渐进式图片 图片一开始是模糊的&#xff0c;然后逐渐的开始变的清晰。如果页面上有一些大图&#xff0c;如果直接扔给浏览器的话那么图片的传输时间就会比较长&#xff0c;用户就…

fastadmin学习08-查询数据渲染到前端

index.php查询&#xff0c;这个是前台的index.php public function index() {$slideImgs Db::name("slideimg")->where("status",,normal)->limit(5)->order(sort,desc)->select();$productList Db::name("product")->where(…

windows10 上安装 docker

windows 10 上安装 docker 官方目前给的方案是利用 Docker Desktop 来安装 docker 环境 一、安装前准备工作 1.1 检查系统要求 Windows 10 64 位&#xff1a;Home 或 Pro 2004&#xff08;内部版本 19041&#xff09;或更高版本&#xff0c;或者 Enterprise 或 Education 1…

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

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

【Clang+LLVM+honggfuzz学习】(二)honggfuzz的安装与试用

书接上篇【ClangLLVMhonggfuzz学习】&#xff08;一&#xff09;LLVM简介、安装和第一个Hello Pass 本篇介绍honggfuzz的安装与简单使用 本文架构&#xff0c;PS:可选择观看哦 前言git安装试用编写测试文件demo.c设置环境变量开始fuzzFuzz-ing疑问 前言 漏洞检测做毕设&#…

【leetcode】 c++ 数字全排列, test ok

1. 问题 2. 思路 3. 代码实现 #if 0 class Solution { private:vector<int> path; // 满足条件的一个结果 vector<vector<int>> res; // 结果集 void backtracking(vector<int> nums, vector<bool> used){// 若path的个数和nums个数相等&…

事件循环(2024 面试题)

答题大纲 先说基本知识点&#xff0c;宏任务、微任务有哪些说事件循环机制过程&#xff0c;边说边画图出来说async/await执行顺序注意&#xff0c;可以把 chrome 的优化&#xff0c;做法其实是违法了规范的&#xff0c;V8 团队的PR这些自信点说出来&#xff0c;显得你很好学&a…

Unsafe类详解

1. Unsafe 概念 Unsafe类位于sun.misc包下&#xff0c;它是java实现高并发的基础&#xff0c;通过它可以执行一些不安全的操作&#xff0c;如像C语言一样直接操作内存资源&#xff0c; 它提供的这些方法增强了java对底层资源的操作能力&#xff0c;但同时也增加了程序出错的风…

typdef:深入理解C语言中typdef关键词的用法

typedef&#xff1a;C语言中的类型重命名关键词 在C语言中&#xff0c;typedef 是一个非常有用的关键词&#xff0c;它允许我们为现有的数据类型定义一个新的名称。这不仅使得代码更加清晰易读&#xff0c;还提高了代码的可维护性。在这篇博客中&#xff0c;我们将深入探讨 ty…

git中对子模块的本地修改、提交和推送远程仓库

场景 当前的某个项目&#xff0c;其使用了另一个项目&#xff0c;我在本地需要对子项目进行修改&#xff0c;并将这些修改提交到github中的子项目和父项目。其实在github中&#xff0c;子项目都是特定的指向子项目的某次提交&#xff0c;因此对于父项目的修改&#xff0c;其实…