首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【熟视C语言】如何快速了解一个库函数(C语言讲解,以string.h中部分库函数为例)

当然,在这之后还有一个最好方法,也就是本篇文章重头戏——模拟实现库函数。接下来我将逐个讲解并模拟实现一部分string.h中函数。...函数返回值一个整型值,这个返回值是由两个字符串关系决定两个字符串相同时则返回0,而不相同时大于0则说明第一个字符串比第二个字符串值更大,小于0则更小,而这个值其实是比较遇到第一个不相同字符比较...该函数从两个字符串第一个字符开始比较是否相等,遇到比较到不同字符或者遇到终止字符'\0'停止比较,并且这个函数比较是字符二进制值(参考ascii码值表)。...memcpy基本相同,唯一一点不同是不要求两个指针指向空间不能重叠,相应,这个函数功能与memcpy其实也基本相同,但是能处理两个指针指向空间重叠情况。...指向字符串'\0’会被覆盖 num大于source指向字符串长度,会以'\0'为停止标志且'\0'会被连接上,而小于,为确保新字符串有停止标识,需自行加上'\0' 代码实现: char* strncat_simulation

20510

C语言详解(二) - 函数

在使用某个函数只需要知道它在哪个库函数中,然后在自己程序开始添加相应库函数即可。 .h结尾文件是头文件。...一些返回值类型举例 char 字符型 int 整型 float 单精度浮点型 double 双精度浮点型 char* 字符指针 int* 整型指针 float* 浮点型指针 double* 浮点型指针 函数名命名与变量命名相同...3.2 声明 函数定义可以放在程序开头,但函数定义一般会跨越多行,有多个函数被定义main函数前面将会变得繁杂,不利于我们写程序。函数一般满足先声明后使用。...4.3 实参与形参区别 在函数被调用、实参把值传递给形参,形参才在内存中被创建,才开始有效。在被调函数执行完返回,包括形参在内、在被调函数内有效所有变量均被销毁,释放被占用内存空间。...也就是说实参传递给形参形参占用了新内存空间,即实参与形参具有相互独立储存空间,形参值得改变不会对实参值产生影响,形参是实参一份临时拷贝。

83610
您找到你想要的搜索结果了吗?
是的
没有找到

C进阶:字符串相关函数及其模拟实现

一.strlen 1.功能 计算字符串长度,直到遇到 '\0' ; 2.模拟实现 我们是仿照库函数方式模拟,所以先来看看strlen 再库函数里是如何定义; 这个函数很简单,所以直接上代码: unsigned...3.模拟实现 库函数定义: 思路一:要找到目标字符串结尾在哪里,然后再把源字符串内容追加在后面; 思路二:将目标字符串结尾处作为起始地址,把源字符串内容拷贝进去; 让我们来看代码: char...要比较两个字符串有相同字符,继续向后比较,直到遇到不同字符,判断其不同字符大小,如果一直相等,则两字符串相等; 这个函数实现起来也不复杂,代码: int my_strcmp(const...2.模拟实现 既然是在一个字符串中查找另一个字符串,那么我们肯定是从第1个字符开始,如果相同,那么向后继续查找,如果不同,则换一个查找起始点,但有时候我们会碰到查找到部分相同,剩下部分不相同,...个字节,看是否相等,剩下字节数小于 n ,后面肯定找不到相等了,所以这个时候直接返回 NULL; 具体代码: char* my_strstr(const char* str1, const

12110

模拟C语言库函数strlen实现

模拟C语言库函数strlen实现 1.0直接使用while循环 1.0 参考代码 2.0 不创建变量使用递归计算字符长度 2.1 参考代码 3.0 参考库函数模拟实现strlen 3.1const 作用...今天来教大家一下在C语言中我们如何模拟实现strlen这个库函数功能。...";//这里把我们自己模拟实现 //命名为 my_strlen int ret = my_strlen(arr);//然后用ret接收返回字符长度 printf...,否则报错 所以我们也将代码优化一下 3.2 参考代码 #include //assert宏头文件 //版本3 //参照库函数模拟strlen size_t my_strlen...= NULL);//这里意思是当我们传过来字符串 while (*str++)//是个空指针,及时警告提示 { count++; } return count; } 这样我们就把

10210

C语言进阶——字符串&&内存函数

码值做对比 模拟实现 strcmp    我们可以通过指针移动来模拟实现这个函数,即指向 str1 指针 dest、指向 str2 指针 src,对两个指针解引用后值进行比较,如果相同就同时向后偏移...,下面给大家做了一个汇总表格,让大家看看有哪些现成可用库函数: 函数 条件满足(即所传递参数符合条件)返回真 iscntrl 任何控制字符 isspace 空白字符,比如空格、换页、换行、回车、...值得一提是,当我们自己给自己拷贝,并且拷贝空间与目标空间重叠,自己设计函数会出问题,会有值被覆盖掉,因为它默认从前往后拷贝(会产生覆盖现象)。...*(char*)src && *(char*)dest) return 1;//空间为空,且目标空间不为空 if (!*(char*)src && !...*(char*)dest) return 0;//空间与目标空间都为空,避免无效循环 //类似于 strncmp 判断条件 while (--num && *(char*)dest ==

19010

C++学习:从基础到QT实现

c++里面自带头文件比如, cstdio, cstdlib, cstdbool 非标准c库函数 自定义库函数比如:calc.h, calc.c calc.h #ifndef _CALC_H...; } int main(void) { data = 123; } 作业 1、简述C++中命名空间作用。...2、 定义两个命名空间A 和 B 分别在A中和B中定义变量value 在main函数中将两个空间value打印出来。 3、const int a; 在C++编译器中是否需要初始化,为什么?...4、在c++中怎么使用c库函数 5、c++常用后缀有那些?...6、说下命名空间中匿名空间作用, 以及与c语言中static异同 7、结合c++中堆空间分配,测试下系统中最大可以分配多少字节空间 8、根据学过内容编写一个程序计算栈开始位置(大概位置)

72920

【C语言】memcpy()函数(内存块拷贝函数)

代码编写 注:该模拟实现代码按C语言标准定义实现,具有memcpy()函数完备功能,但不能实现内存块重叠拷贝,对此感兴趣朋友可以移步本文第四段:my_memcpy()函数不足....四.模拟实现my_memcpy()函数不足 首先需要感谢一下这位大佬指出了模拟实现代码中存在问题: 然后,我先在vs2022环境中测试了一下库函数在面对该问题处理结果: 即源拷贝地址与目标拷贝地址重叠...又测试了一下模拟实现函数my_memcpy()函数在面对该问题处理结果: 具体操作同上: 可以发现,我们上面实现my_memcpy()函数在面对源地址空间与目标地址空间有重叠,拷贝结果就会出现错误...我们画图分析一下拷贝失败原因: 这说明从前向后拷贝逻辑my_memcpy()函数是不能胜任地址空间重叠拷贝. 那么我们之前模拟实现就完全错误了吗? 不是的!...让我们再来看一下文章开头C语言标准对memcpy()函数定义: 也就是说,C标准是不要求memcpy()函数能够拷贝重叠内存块,如果我们期望使用可以重叠内存块拷贝函数,那么另一个C标准库函数

37810

嵌入式Linux:Linux库函数

1、Linux库函数简介 Linux 提供了丰富库函数,涵盖了各种领域,从文件操作到网络编程、图形界面、数学运算等。...这些库函数大多数都是标准 C 库函数,同时也包括一些特定于 Linux 系统库。 Linux库函数通常以动态库文件(.so)形式提供,存放在根文件系统 /lib 目录下。...这些库函数设计旨在提供比底层系统调用更方便、更易用、更具可移植性调用接口。它们之间区别如下: 库函数属于应用层,而系统调用是内核提供给应用层编程接口,属于系统内核一部分。...库函数运行在用户空间,而调用系统调用会导致从用户空间(用户态)陷入到内核空间(内核态)。 库函数通常具有缓存,而系统调用是无缓存,因此在性能和效率上,库函数通常优于系统调用。...可移植性方面,库函数相对于系统调用具有更好可移植性。由于不同操作系统系统调用定义、功能、参数列表、返回值等通常不同,C 语言库函数在不同操作系统之间接口定义几乎相同,因此具有更好可移植性。

8600

库函数模拟实现

前言: 在上一篇文章中我们了解到了一些库函数使用,为了加深我们对库函数理解,我们来模拟实现一下这些库函数用法。...strcpy在库函数里面的规定返回值是目标空间起始地址,所以先用char*指针保存一下dest起始地址,最后返回ret。...用第一个while循环找到目标空间末尾,再用第二个while循环进行数据追加,追加过程和strcpy是一样。...先写一个while函数判断字符是否相同相同则++进行下一个字符比较,如果不相同则进入if,判断是>还是则返回1,否则返回-1。...用if判断如果s2++出现了等于\0情况,那么就是全部找到了,这个时候就返回cp就行了。s1为\0时候也是返回NUL。 今天分享到这里就结束啦!谢谢老铁们阅读,让我们下期再见。

12610

linux——管道详解

使用单个固定缓冲区也会带来问题,比如在写管道可能变满,这种情况发生,随后对管道write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够空间供write()调用写。...所有当前进程数据已被读取,管道变空。这种情况发生,一个随后read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束问题。...写进程向管道中写入时,它利用标准库函数write(),系统根据库函数传递文件描述符,可找到该文件 file 结构。...写入进程实际处于可中断等待状态,内存中有足够空间可以容纳写入 数据,或内存被解锁,读取进程会唤醒写入进程,这时,写入进程将接收到信号。...实现与 Windows 相同管道创建目标,Linux 和 UNIX 使用下面的代码片段: 创建 Linux 命名管道 if(pipe(fd1)) { printf("pipe() FAILED:

2.9K20

posix是什么都不知道,就别说你懂Linux了!

POSIX是IEEE为要在各种UNIX操作系统上运行软件而定义一系列API标准总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。...库函数API和系统调用区别 如上图所示: (1) 库函数是语言或应用程序一部分,而系统调用是内核提供给应用程序接口,属于系统一部分 (2) 库函数在用户地址空间执行,系统调用是在内核地址空间执行...我们只能在代码层去思考可移植问题,在API层面上由于各个操作系统命名规范、系统调用等自身原因,在API层面上实现可移植也是不大可能。...为了给设备和文件提供更高层接口,Linux系统提供了一系列标准函数库。 使用标准库函数,可以高效写任意长度数据块,库函数在数据满足数据块长度要求安排执行底层系统调用。...当应用程序调用printf()函数,printf函数会调用C库中printf,继而调用C库中write,C库最后调用内核write()。

1.9K50

C语言进阶指南(2)(库函数与自定义函数)

二、 库函数C语言标准规定了一些库函数,这些库函数具有完成某个特定任务作用,编译器产商根据这些标准来实现库函数功能。...这些库函数都是由巨佬实现功能,所以大家可以放心使用哦我们常见printf(),scanf()就是库函数,当我们使用库函数,我们需要引用相应头文件,以printf()函数为例,我们需要引用<stdio.h...嵌套调用在函数调用过程中调用另一个函数称为嵌套调用链式访问将一个函数返回值用作另一个函数参数三(2)、自定函数声明函数声明、定义和调用函数声明:将一个函数类型,名称,参数类型写在头文件上,...三(4)函数调用分为传值调用和传址调用传值调用:实参传输数据给形参,其原理为将实参值临时拷贝用于形参进行运算执行。因形参和实参占用不同内存块。函数调用结束后,形参值不会改变实参。...函数递归调用时,系统要在栈中不断保存函数调用时现场和产生变量,如果递归调用太深,就会造成栈溢出,这时递归无法返回。再有,函数调用层次过深也可能导致栈无法容纳这些调用返回地址而造成栈溢出。

9510

UNIX(进程间通信):09 管道到底是什么

使用单个固定缓冲区也会带来问题,比如在写管道可能变满,这种情况发生,随后对管道write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够空间供write()调用写。...所有当前进程数据已被读取,管道变空。这种情况发生,一个随后read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束问题。...写进程向管道中写入时,它利用标准库函数write(),系统根据库函数传递文件描述符,可找到该文件 file 结构。...写入进程实际处于可中断等待状态,内存中有足够空间可以容纳写入 数据,或内存被解锁,读取进程会唤醒写入进程,这时,写入进程将接收到信号。...实现与 Windows 相同管道创建目标,Linux 和 UNIX 使用下面的代码片段: 创建 Linux 命名管道 int fd1[2]; if(pipe(fd1)

1.2K10

【C语言】函数详解

每一个函数名称与特性会被写成一个电脑文件,这个文件就称为头文件,但是实际函数实现是被分存到函数库文件里。头文件命名和领域是很常见,但是函数库组织架构也会因为不同编译器而有所不同。...也就是说,标准函数库是由编译器发行厂商制作进行添加,每个编译器库函数内容可能不一样,但是功能是按照C语言标准制作,功能实现效果和方法几乎是一样。...像最长接触printf、scanf、for、gets等就是库函数,包含在特定库函数中。这种从库中直接拿出来使用就叫库函数,可以极大地提高编写代码效率。...实参和形参如果表示符号相同不会相互影响,实参只是为形参传值 。...,如下: 之后只需在要作为实现功能.c文件中引入头文件,然后直接调用函数即可,演示如下: 通过此种方法即可将函数“储存”在一个头文件中,方便自己使用,并且对多人合作开发具有很高提高效率作用

10610

Linux之动态库和静态库

动态库(.so):库文件以.so为后缀,程序在运行时才去链接动态库代码(运行时跳转到动态库中,在动态库中执行库函数)。多个程序共享库代码。 链接本质:我们调用库函数是如何与标准库联系。...库名称:去掉前缀lib和后缀'.a/.so'剩下就是库名称,例如:libc.so就是C库。 gcc/g++,在编译默认使用动态链接,如果想要生存静态链接,我们要带上-static。...把静态库代码拷贝到内存中代码区: 动态库通过fPIC形成位置无关码,采用相对编址方式,在程序链接将对应库中偏移量添加到程序中,库函数在程序运行时加载进来,经过页表,把库映射到虚拟地址空间后...(共享区),库就具有了起始地址。...动态库相对于静态库更节省内存,静态库由多个程序使用相同库函数,加载到内存中就会导致内存中有多份重复库函数代码,而动态库则是多个程序共用一份动态库,不会导致出现重复库函数代码,就节省了内存空间

37720

指针(4)

当我们使用qsort进行排列,其qsort函数内部是通过快速排序来实现排列(我们并没学快速排列,其涉及知识对我来说超纲) 对于其参数四个类型中,唯独最后函数指针接受其相同类型函数函数名:所以其接收函数需要自定义...e1所指向数组中内容大于e2所指向数组中内容,返回值大于0(小于,返回值小于0)为升序排列。 相反,e1内容小于e2,返回值却大于0。e1内容大于e2,返回值小于0.则为降序排列。...对于qsort函数排序不同类型不同代码格式,这里我们还展示其他几种特殊排列。...而字符串大小比较是先拿第一个字符ascall码值进行比较,谁ascall码值大谁字符串大,如果第一个相等则拿第二个进行比较,依次下去(如果到最后都相同,则相等,也就是两个字符串是一样) 在下面这篇文章中有更多关于字符串大小比较细节...所以这就是qsort函数模拟实现(用冒泡排序实现跟其本质快速排序实现不一样) ,这模拟实现其实没有太过复杂。我们可以了解下知道它一些很巧妙地方,提升下思维。

5810

库函数之字符函数与字符串函数(上)

.✨ 学习库函数模拟实现之前,要先了解两个这两个 const关键字和assert()库函数 1.对于**const关键字,**这位博主讲十分详细....assert()中参数表达式为真,什么也不会发生,在release版本中,assert会被优化掉....模拟实现: 注意事项: 四、strcmp函数 函数作用: 函数参数: 模拟实现: 推荐查询库函数网站: 查询库函数网站 一、strlen函数 函数原型: 函数作用: 用于计算字符串长度...目标空间必须有足够大,能容纳下源字符串内容。 目标空间必须可修改。 重点 不可自己追加自己,否则不知道什么时候停下来,因为’\0’被改掉了....: 你还有3次机会: 123 很遗憾,密码错误 请输入密码: 你还有2次机会: 1433223 很遗憾,密码错误 请输入密码: 你还有1次机会: 1234 很遗憾,密码错误 密码输入正确

26420

Functions在JavaScript中是作为 first class objects存在

:可以减少重复性代码 能够在程序中以function形式传递逻辑,就意味着可以把重复代码写为一个库函数。...让我们把每次相同事情(遍历已有清单,建立新清单)从不同事情(应用不同过滤器)中分离出来。...遍历已有清单并建立新清单逻辑可以写成一个库函数,过滤逻辑可以作为一个参数传递给库函数: ``` var array_helper = { filter: function(list, filter...在JavaScript中使用objects采用所有技巧都依赖这件事。...其它语言中一些常用概念(如,命名空间,定制事件custom events,静态方法,扩展方法)都可以被模拟,因为在任何地方都可以创建function。

71620

Linux面试专题

持有信号量进程将信号量释放后,在等待队列中一个任务将被唤醒,从而便可以获得这个信号量。...(2)命名管道(named pipe):命名管道克服了管道没有名字限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间通信。命名管道在文件系统中有对应文件名。...Linux 内核如果一定要进行浮点运算,需要在建立内核选上math-emu,使用软件模拟计算 浮点运算,据说这样做代价有两个:用户在安装驱动需要重建内核,可能会影响到其他 应用程序,使得这些应用程序在做浮点运算时候也使用...16) 模块程序能否使用可链接库函数? 模块程序运行在内核空间,不能链接库函数。 17) TLB 中缓存是什么内容?...TLB,页表缓存,线性地址被第一次转换成物理地址时候,将线性地址和物理地址对应放到TLB中,用于下次访问这个线性地址,加快转换速度。 18) Linux 中有哪几种设备? 字符设备和块设备。

9910

【C语言基础】:函数详解

:在调用函数,传递给函数实际参数个数必须与函数声明或定义中形式参数个数相同,否则会导致编译错误。...二维数组形参行可以省略,但列不能省略:函数形式参数是二维数组,可以省略数组行大小,但不能省略列大小。这是因为在二维数组中,每一行大小必须是相同,而列大小可以不同。...数组传参不会创建新数组:将数组作为参数传递给函数,函数内部使用是原始数组地址,而不是创建一个新数组。这意味着对形参数组修改会直接影响原始数组。...修饰全局变量 static用于修饰全局变量,它表示该变量作用域仅限于当前文件,在其他文件中是不可见。...修饰局部变量 static用于修饰局部变量,它表示该变量在程序执行期间一直存在,而不是像普通局部变量那样只在函数执行时存在。

9610
领券