![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
坤昱
这个作者很懒,什么都没留下…
展开
-
一起学习C语言:函数(四)
上一篇<一起学习C语言:函数(三)> 中,我们了解了变量的储存类别与声明方式,以及函数的递归调用原理。本章节,我们分析函数的指针调用,以及函数指针作函数参数使用的场景。章节预览:8. 函数的指针调用8.1 函数指针作函数参数使用9. 本章总结目录预览章节内容:8. 函数的指针调用 前面小节中我们了解到全局变量和静态变量在程序编译期间确定逻辑内存地址和内存空间大小,并在程序执行期间分配实际内存地址和对应的内存空间大小。当然,函数也是采用类似的形式原创 2020-09-20 22:13:01 · 2190 阅读 · 6 评论 -
一起学习C语言:函数(三)
上一篇<一起学习C语言:函数(二)> 中,我们了解了内部函数和外部函数,以及变量的声明周期与作用域。本章节,我们分析函数的存储类别与声明方式,以及函数的递归调用原理。章节预览:6. 变量的存储类别与声明方式7. 函数的递归调用目录预览章节内容:6. 变量的存储类别与声明方式 在C语言中,全局变量可以如全局函数那般在别的文件内使用,局部变量也可以具有全局变量相同的生命周期。 在前面的内容中,我们了解到内存分为动态内存和静态内存。其中动态原创 2020-09-06 22:28:01 · 1862 阅读 · 2 评论 -
一起学习C语言:函数(二)
上一篇<一起学习C语言:函数(一)> 中,我们了解了函数的概念,以及函数实现与程序编译过程。本章节,我们分析内部函数和外部函数,以及变量的生命周期。章节预览:4. 外部函数与内部函数4.1 外部函数4.2 内部函数5. 变量的生命周期与作用域目录预览章节内容:4. 外部函数与内部函数 默认情况下,我们定义或声明的函数属于“外部”函数,又称为“全局”函数。全局函数即可以被本文件中的其他函数调用,也可以被其他文件中的函数调用。原创 2020-08-01 21:51:07 · 1544 阅读 · 0 评论 -
C语言 strnlen函数实现
作为获取字符串长度的函数strnlen(),在上一版本strlen()函数的基础上增加了获取长度的限制。函数定义如下:size_t strnlen(const char *s, size_t count);代码实现如下:size_t Test_strnlen(const char *s, size_t count){ const char *sc; for (sc = s; coun原创 2017-03-13 23:09:20 · 4878 阅读 · 0 评论 -
C语言 strspn函数实现
strspn()函数从名称上来讲属于字符串查找,但实际应用中发现strspn()函数用来在一个字符串中从首地址开始向后递增排查”添加的参数”在这个字符串的范围是多少个字节。函数定义如下:size_t strspn(const char *s, const char *accept);代码实现如下:size_t Test_strspn(const char *s, const char *accept原创 2017-03-16 21:28:42 · 2439 阅读 · 0 评论 -
C语言 strcspn函数实现
strcspn()函数命名与strspn()函数及其相似,那么作用又有什么样的差别那?··· 经过测试strcspn()函数与strspn()函数用法完全相反,strcspn()函数是在一个字符串中从首地址开始向后递增一直遇到”添加的参数“停止。函数定义如下:size_t strcspn(const char *s, const char *reject);代码实现如下:size_t Test原创 2017-03-16 21:58:38 · 1206 阅读 · 0 评论 -
auto形式(更多功能)类结构实现
最近思来索去~一直都是写模板做数据结构还没有真正意义上的可以储存任意数据类型的结构,使用auto还需要先初始化类型,便着手自己实现了一个支持储存所有数据类型(包括自己创建的类或者结构体)。设计初衷打算仿auto形式(传入什么类型便使用什么类型),这么做确实比较简单点但实用性不强。后来考虑可以参考CString增加Format格式化输入字符串和任意类型转换(当然不包括自己创建的类,因为不是一种形式),原创 2020-02-15 12:56:07 · 1510 阅读 · 0 评论 -
字符串转换到double数组
最近写了一个小工具需要从文件中读出数字以double类型显示并计算(文件中包含空格换行逗号作为完整数字标记 ,并且运行负数),由于需要从读取到的字符串中截取数字稍微麻烦,便动手封装个方法截取转换一次完成。设计函数的过程中也遇到一些小问题,比如整数部分和小数部分的计算方式不一样,只能通过分开计算然后相加完成转换, 整数部分需要乘以10相加 ,小数部分需要除以10相加 ,并且小数部分遇到0不相加选择跳原创 2017-07-15 12:31:37 · 5989 阅读 · 0 评论 -
C语言实现XML生成解析库(XML扩展)
放假期间在家有点无聊,前一段时间对XML的生成、解析比较感兴趣,便根据自己对XML的理解结合链表实现一个XML的制作与解析的结构。设计采用了固定格式头信息加自定义头信息: 《?xml version=”xml” encoding=”Utf-8”? 》这段数据属于固定格式头信息,里面的”xml”和”Utf-8”可以通过库函数进行修改; 《?567?》这段数据属于自定义头信息,可以自由增加;原创 2017-10-04 21:38:24 · 2552 阅读 · 0 评论 -
linuxPci驱动获取指定设备bus、device以及devfn数据方式
在vxworks系统中,调用pciFindDevice()函数可以直接获取到指定设备的bus、deviceNo以及devfn数据信息。相对于linux系统,vxworks编写驱动相对简单一些。linux系统下bus、deviceNo以及devfn数据由驱动内部函数使用 (编写驱动过程中这些数据几乎用不到),并且没有提供明确的接口,需要我们自己分析驱动函数调用这些数据的方式。首先在Terminal输入原创 2017-11-17 22:01:05 · 5681 阅读 · 0 评论 -
C语言实现简单的内存管理机制
在C类型程序中,栈内存比较珍贵,大部分用在局部或者类成员(因为稀少… 不适合长时间占用一块栈内存),对于大量数据一般使用堆来分配。重复用堆分配有一个显著的缺点就是容易造成外部碎片,在这种情况下系统内存不再连贯,一些内存得不到使用,久而久之系统内存会变的越来越少,长时间处理大数据会出现一些不可预料的问题。针对这种情况,我以自己的习惯写了一个简单的内存管理结构,加深自己对内存的理解。首先简单说...原创 2018-03-15 22:04:22 · 7411 阅读 · 1 评论 -
C语言实现无规律数据加密、解密(使用文件加密、解密做演示)
在网络传输重要信息或存储重要文件信息时,大部分会对数据加密,保证数据的安全性。互联网上流行的可逆加密方式对数据的安全性没有保证,便自己写了一套安全性极高加密、解密方法。方法的实现方式及特点: 1.采用指定单个字节加密转换(转换形式为ascll码表中0-128的形式,由1个字节拆分为三个字节,下面说明拆分方式);2.采用数组中随机数据减指定加密字节(比如当前数据ascll码为121...原创 2018-05-30 23:11:19 · 4149 阅读 · 4 评论 -
C语言实现内存池
之前编写数据管理结构时用到内存池,在写过的内存管理结构(内存管理结构)的基础上进行重新设计,使其达到内存释放"0碎片"、一体化管理。目前内存池拥有以下功能:1.自适应分配超过默认内存池大小的单个内存池(单个内存池默认大小为100M,可以通过修改宏定义或调用修改函数指定新的内存池大小;单个内存池最大内存分配与编译器分配相同,MFC32位工程最大分配在1G左右);2.每个内存池都有自己的内存池描...原创 2018-09-25 23:32:20 · 1950 阅读 · 0 评论 -
C、C++实现的一种智能数据管理架构
之前研究STL相关结构的时候,发现STL系列的map、list、vector等设计有以下缺陷:1.迭代删除节点的情况下只可以删除一个节点(不包括清除所有节点的情况);2.在多线程情况下需要加锁或临界区等形式同步对象结构信息,这种情况属于当前大部分系统设计的短板;3.计算机运行内存产生碎片(STL系列结构分配一个新节点需要申请一次相应长度的内存空间,当清除这个节点时,这块内存有可能过短无法再次...原创 2018-11-25 20:37:21 · 1071 阅读 · 0 评论 -
C语言 strlen函数实现
用字符串时strlen()函数是用到最多的函数之一,其作用获取是获取字符串的长度。函数定义如下:size_t strlen(const char *s);代码实现如下:size_t Test_strlen(const char *s){ const char *sc = s; for (; *sc != '\0'; ++sc); return sc - s;}实现原理:原创 2017-03-13 22:41:52 · 5272 阅读 · 0 评论 -
C语言 strcat函数实现
strcat()函数从名称来讲就是索的含义,用途:在一个字符串的末尾增加新的字符。函数定义如下:char *strcat(char *dest, const char *src);代码实现如下:char *strcat(char *dest, const char *src){ char *tmp = dest; while (*dest) dest++; w原创 2017-03-13 22:27:05 · 9884 阅读 · 0 评论 -
C语言 strlcpy函数实现
strlcpy()函数是strcpy()函数的第三版,在strnpy()(第二版)的基础上增加了对源字符串的判断并且字符拷贝完成后增加’\0’,下面贴上linux实现方式:函数定义如下:size_t strlcpy(char *dest, const char *src, size_t size);函数实现如下:size_t Test_strlcpy(char *dest, const char *原创 2017-03-13 21:57:48 · 8438 阅读 · 4 评论 -
C语言 memset函数简单实现
数组对象初始化时,使用memset函数非常方便。对于CString却是个坏方法,会释放掉CString内部分配的内存,并且导致其指针对象变成野指针。 下面贴上memset函数实现方法:void* MemSet(void* dst,int val,int size){ char *_dst = (char*)dst; assert ('\0' != *_dst);//dst数据原创 2017-01-02 15:36:23 · 2958 阅读 · 0 评论 -
C语言 atoi函数简单实现
有时候需要字符串转换到int类型,使用atoi函数可以轻松完成类型转换。 下面贴上atoi函数实现方法:int Atoi(const char* src){ assert(NULL != src);//思索了好久,第一位为0允许,遂判读地址不为空 int _num = 0; int _sign = 0; while ('0' == *src ||' ' ==原创 2017-01-02 16:35:11 · 3304 阅读 · 0 评论 -
C语言 itoa函数简单实现
函数传参有时候会用到int类型转换为字符串,使用itoa函数完成转换类型的基础上,还可以指定转换进制类型(比如16进制,10进制,8进制或者2进制)。下面贴上itoa函数实现方法:char* Itoa(int val,char* dst,int radix = 10);//定义的时候默认指定10进制char* Itoa(int val,char* dst,int radix){ char原创 2017-01-02 18:14:45 · 6273 阅读 · 0 评论 -
STL之Map完整(Linux内核)内部实现
刚开始接触Map的时候,了解到Map采用映射的方式储存数据,为了满足自己的好奇心,自己参考相关书籍,并且调试Linux系统的Map源码,成功完成了Map完整代码的封装。总体来说Windows系统Map与Linux系统Map采用了相同的实现思路,只是实现细节有点较小的差异。 同样采用相同的数据结构红黑树做为Map内核链表绑定数据的存储路线(代码内部有Window、Linux系统红黑树相关的实现原创 2017-01-18 21:07:30 · 4499 阅读 · 2 评论 -
C语言 printf函数实现
printf()是控制台程序中最常用的函数,作用是输入的字符、数字等信息拼成完整的句子并且输出到标准输出设备(显示器、控制台等)。 下面是printf()定义:int printf(const char *fmt, ...)printf()实现部分:int Test_printf(const char *fmt, ...){ //定义接收输出信息最大长度1024字节 char原创 2017-02-21 22:51:31 · 5567 阅读 · 0 评论 -
C语言 strsep函数实现
strsep()函数属于字符串处理函数,作用是使用关键字符(可以是一个,也可以是一个字符串)在一块完整的字符串内存中递增顺序查找,如果在这块字符串内存中查找到关键字符其中的一个那么在当前字符串的位置设为0并且返回下一个字符的地址(在查找到的地址加一个字节),如果没有查找到关键字符返回0。函数定义如下:char *strsep(char **s, const char *ct);代码实现如下:char原创 2017-03-17 23:21:41 · 5476 阅读 · 0 评论 -
C语言 sprintf实现
我们已经知道printf()是控制台程序中最常用的函数,作用是输入的字符、数字等信息拼成完整的句子并且输出到标准输出设备(显示器、控制台等),sprintf()函数命名与printf()函数及其相似又有什么作用呢?··· 其实sprintf()作用也是输入的字符、数字等信息拼成完整的句子,只不过是输出在第一个参数中(char* 类型)。下面是sprintf()定义:int sprintf(ch原创 2017-03-10 00:24:55 · 11096 阅读 · 1 评论 -
字符串Ascll格式转16进制
之前做过一些项目需要用到ASCLL码转换到16进制,在网上搜索后发现,大部分都是10进制数字转16进制数据,这对于8位字符类型unsignal char (这里不用char,因为char是-127到128,对于129-255之间的数溢出变为负数,算起来稍微麻烦 ,采用unsignal char是因为它的值在0到255) 来讲他可以接收最大为255的数字(从Ascll码左边可以看到数字),原创 2017-03-27 22:00:46 · 4595 阅读 · 0 评论 -
字符串16进制数字转换到Ascll字符串
16进制数字转换到Ascll的原理也比较简单,由于unsignal char是8位数据 (这里用unsignal char的原因是表示的数字大小为0-255,用16进制数字FF表示) 可以包含2位16进制数据,所以由2个16进制数字char转换为一个Ascll unsignal char;函数定义如下:int HexToChar(unsigned char* dst,const void原创 2017-03-27 23:03:55 · 4728 阅读 · 0 评论 -
二进制字符串转换到Ascll字符串
之前有个朋友问我如何使用二进制文件转换为Ascll格式文件,随在整理文件的时候写了一个二进制字符串转换到Ascll字符串的简单转换方式。函数定义如下:int BinaryToAscll(unsigned char* dst,const void* src,int low,int len);代码实现如下://第一个参数表示输出转换Ascll字符串 空间大小为src的8分之一//第二个参数表示输入字符原创 2017-03-27 23:24:03 · 2815 阅读 · 0 评论 -
Ascll字符串转换到二进制字符串
上一章说到二进制字符串转换到Ascll字符串的方法,本章按照同样的原理来说下Ascll字符串转换到二进制字符串的方法。函数定义如下:int AscllToBinary(char* dst,const void* src,int low,int len);代码实现如下://第一个参数表示输出转换二进制字符串 空间大小为len长度的8倍//第二个参数表示输入字符串(Ascll)//第三个参数表示是否原创 2017-03-27 23:40:38 · 4499 阅读 · 1 评论 -
C语言 strcpy函数实现
前面写了用C语言关于字符串拷贝时可以用memcpy,其实不用memcpy也可以实现字符串的拷贝 —— strcpy专门针对字符串拷贝的函数,下面贴上linux实现方式。函数定义如下:char *strcpy(char *dest, const char *src);函数实现如下:char *Test_strcpy(char *dest, const char *src){ char *tm原创 2017-03-13 21:17:59 · 3783 阅读 · 0 评论 -
C语言 strncpy函数实现
strncpy()函数属于strcpy()函数的扩展版本,由于strcpy()没有明确的停止条件(strcpy()存在的问题暂不讨论),strncpy()在原来的基础上增加了拷贝字节数长度,下面贴上linux实现方式。函数定义如下:char *strncpy(char *dest, const char *src, size_t count);函数实现如下:char *Test_strncpy(ch原创 2017-03-13 21:32:36 · 9039 阅读 · 0 评论 -
C语言 memcpy函数(增加dst 从第一字节拷贝判断)的内部简单实现方式
刚学习C语言编程的时候,感觉C内部函数深不可测,通过代码很难实现。后来经常慢慢的学习过程,理解了部分C函数的实现方法,下面简单说下memcpy函数的内部实现方式之一。简单概括内存拷贝的含义:字节对齐字节进行赋值(比如单个字节对齐单个字节,四个字节对齐四个字节)。void* MemCpy(void* dest,const void* src,int size)//拷贝函数{ if (NULL原创 2017-01-02 01:07:29 · 1767 阅读 · 0 评论