C世界
文章平均质量分 63
来知晓
时光如流水
一定要从中
捉几条鱼
展开
-
C学习:一个百思不得其解的无符号数移位问题
在做一个算法定点化移位过程中,遇到个**奇怪问题**:分别按无符号数和有符号数进行右移,竟然不管啥输入,res1和res2结果都一样。原创 2023-04-04 21:04:34 · 352 阅读 · 0 评论 -
C学习:不同位宽整数扩展问题分析
总的来说,主要有三种位宽转换:- 短位宽到长位宽- 长位宽到短位宽- 同位宽转换原创 2023-04-03 20:33:20 · 1049 阅读 · 0 评论 -
C学习:整型数据格式化输出控制的细节
本文小结平常C语言编程中遇到的整型数据格式化输出控制知识,留个笔记方便查阅。原创 2023-03-30 20:50:48 · 529 阅读 · 0 评论 -
C语言实现json文本解析
项目中,有时需要灵活根据外部输入条件,进行程序的灵活切换,运用JSON文件解析,能高效的替换指令行输入,且直观易懂。原创 2022-08-22 20:48:45 · 3109 阅读 · 0 评论 -
C模板:归并排序的C代码魔改适配总结
归并排序,时间复杂度,具有方便、易懂的特点,且属于,使用场景颇多。原创 2022-07-11 21:01:07 · 169 阅读 · 0 评论 -
C模板:快速打印任意维度数组
在C语言调试中,打印一维、二维数组是高频操作,这里总结提炼了原子函数,进行一维二维打印。对于不同类型及长度,仅需修改手工入参和类型转换即可迅速调用。原创 2022-06-03 11:53:46 · 735 阅读 · 1 评论 -
C模板:统计分析数据的最值和平均值
- 描述:精简的原子函数,外部整型/浮点数组均可调用。- 功能:计算数据中的最值、平均值便于统计分析。- 输入:数组元素,最值和均值指针地址- 输出:最值和均值原创 2022-04-15 17:44:39 · 405 阅读 · 0 评论 -
C模板:十进制和十六进制数据批量转换
在项目中,许多时候需要将十进制(`DEC`)的浮点、整型数据,批量转换为十六进制(`HEX`)的数据。这里,提供下C语言的实现版本,有兴趣者,用Python实现可能会更方便些。原创 2022-04-08 17:44:48 · 1595 阅读 · 0 评论 -
C学习:隐藏在负数移位过程中的bug
C学习:隐藏在负数移位过程中的bug问题分析总结问题负数移位时,你是否了解以下两条语句的区别?a /= (1 << bit)a >>= bit分析若右移位后结果>=-1,第一种方法移位与第二种方法移位相同,本质相当于除法。若右移位后结果<-1,则有所区别:第一种方法会保留符号位,不管怎么右移一直保持符号位,结果为-1;第二种方法会丢弃符号位,结果为0;验证代码如下,可尝试将MOVE_BIT修改为4、3、2查看效果:#define MOVE_B原创 2021-08-20 16:40:15 · 110 阅读 · 0 评论 -
C学习:一网打尽字符串骚操作
C学习:一网打尽字符串骚操作引言字符类型判断字符串转换字符串必备操作注意事项引言C语言中字符串的处理场景十分常见,字符处理也很琐碎。本文总结高频常用字符串操作函数、相关技巧及注意事项。一些简单的字符串功能可手写代码实现,比如以下总结。手动挡:手写代码实现小写转大写:char upCh = lowCh - 'a' + 'A';大写转小写:char lowCh = upCh - 'A' + 'a';字符转数字:int num = ch - '0';数字转字符:char ch = i + '0原创 2021-08-11 15:19:37 · 179 阅读 · 0 评论 -
C学习:uthash使用小结
uthash是一个C语言的hash表实现的开源项目。它以宏定义的方式实现hash表,具有运行速度快、与关键类型无关等优点。uthash使用方便,只需将include下头文件uthash.h即可使用。原创 2021-07-21 20:46:07 · 575 阅读 · 0 评论 -
C学习:C语言必备函数模板,让你写C代码省力百倍
C学习:必备常用功能模板字符型与数值转换动态申请二维数组BFS遍历模板我们知道的东西是有限的,而我们不知道的东西则是无穷的。——拉普拉斯字符型与数值转换val -> str,数值到字符串的转换 sprintf()。str -> val,字符串到数值的转换atoi()和sscanf()和。或自己实现:取从高到低取每个字符与'0'相减,并不断乘10累加进位。用法示例:在这里插入代码片动态申请二维数组// 申请对应大小的二维数组并分配空间*returnColumnSiz原创 2021-07-20 10:10:39 · 1874 阅读 · 0 评论 -
C学习:内存分配之malloc函数和alloca函数辨析
C学习:内存分配之malloc函数和alloca函数辨析相同点不同点代码示例参考资料简单总结下这两个函数的本质区别,具体的使用方法这里就不说了。相同点都是动态分配,根据实际运行情况动态分配的内存,而非一开始就分配返回类型相同,都是分配的内存起始地址内存连续,一次调用分配的内存都是逻辑连续的不同点内存分区不同,malloc分配的是堆区内存,需要手动free;alloca分配的是栈区内存,不用手动释放;(注意,栈空间有限仅几kb左右,堆空间远大于栈空间)初始化不同,malloc分配内存后默原创 2021-05-27 10:37:23 · 519 阅读 · 1 评论 -
C学习:基于大顶堆的优先队列数据结构实现
C学习:基于大顶堆的优先队列数据结构实现分析功能分析函数拆分代码实现方法1方法2参考资料相关博客:C刷题:LeetCode 239. 滑动窗口最大值 (困难)分析高级数据结构:大顶堆两种实现:数组、二叉树大顶堆:数组到完全二叉树的映射关系是层序遍历,具体见参考资料3里的内容功能分析在一些场景中,需要这样一种数据结构:优先队列,功能不是先进先出,而是队前端一直是占权重最大的(如最大值或最小值),进入队列后依然要保持。每次弹入弹出都要保证队列单调性,即形成一个单调队列。类似的功能也可以用大顶原创 2021-05-20 17:20:17 · 205 阅读 · 1 评论 -
C学习:一个例子搞清左值右值
C学习:一个例子搞清左值右值概念理清一个例子测试代码概念理清对所有的变量和表达式可归为两类,左值和右值。一句话直白讲:左值:非临时对象,多条语句中均可使用; 可出现在等号左右侧右值:临时对象,仅当前语句有效;只能出现在等号右侧以上概念十分重要,务必理解并记忆。一个例子假设这样一个问题:有个char *类型的指针p,指向了一个int类型的首地址。我们希望跳过当前这个int数据,指向下一个char,思考应该如何操作?进一步地,给出三种实现,判断是否正确:// example1p原创 2021-05-11 16:48:47 · 268 阅读 · 1 评论 -
C学习:二维数组地址与二级指针、内存指向的关系
C学习:二维数组地址与二级指针、内存指向的关系二维数组地址与内存指向的关系取数组名和对数组名取地址的区别参考资料相关推荐:C学习:动态申请二维数组的方法C学习:数组指针和指针数组辨析二维数组地址与内存指向的关系示例代码: int b_arr[][3] = { {3, 2, 5}, {1, 9, 8}, {6, 2, 9}, {5, 2, 4} }; int *p1 =原创 2021-05-04 17:11:19 · 334 阅读 · 0 评论 -
C学习:常用安全函数用法总结
C学习:常用安全函数用法总结字符串操作文件输入输出scanf_sgets_s函数模块模板参考资料相关推荐:C学习:绕不开的常用标准库函数及操作字符串操作文件输入输出scanf_s函数签名int scanf_s( const char *format [, argument]...);说明:功能:输入:输出:返回值:注意事项scanf_s当扫描字符串%s或者字符%c时要传入目标缓存区长度,该长度还需包含结束符\0scanf_s遇空白符(空格、换行、tab等)结束当前变量扫描原创 2021-05-04 16:20:53 · 1072 阅读 · 0 评论 -
C学习:一文搞懂C语言常用数据类型范围及宏引用
C学习:一文说清C语言常用数据类型范围及宏引用常见类型数值范围数据类型范围宏定义常见类型数值范围char/signed char/int/long long 的整数范围整理如下表:类型所占字节最小值最大值char10127unsigned char10255signed char1-128127unsigned short2065535(常用)short int2-3276832767(常用)unsigned int原创 2021-05-04 15:09:13 · 546 阅读 · 0 评论 -
C学习:小白入门C语言常见疑问汇总
C学习:入门时常见疑问汇总本文记录个人自己总结的C语言学习时感到困惑的一些小问题,较深入的问题会单独写博客总结,希望该分享能对大家有所帮助。数据模型(LP32 ILP32 LP64 LLP64 ILP64 )是指什么?参考资料:数据模型的分析,云水整理类型size_t 的作用时?经测试发现,在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。x << 2 或 x >> 2 操作改变x本身没?没原创 2021-05-03 21:20:55 · 928 阅读 · 0 评论 -
C学习:必看基础知识篇整理
C学习:必看基础知识篇整理基础知识调试工具GDB声明:以下内容均收集于网络,并经个人整理提炼,出处已在文中标明,仅供交流学习,侵删。基础知识C或C++语言中,#include时尖括号<>和双引号""的区别?#include <stdlib.h>#include "test.h"<>尖括号,表示自带的库函数,优先去VC++的Include文件夹""双引号,表示先在当前文件所在目录搜索是否有符合的文件,如果没有再到Include文件夹里去找对应的文件。转载 2021-05-03 20:52:00 · 139 阅读 · 0 评论 -
C&C++之内联函数理解
参考:https://blog.csdn.net/duan19920101/article/details/507258541、WHY 为什么使用inline内联函数?目的是提高程序执行效率。内联函数是用函数体替换调用语句,这样执行时就不需要做保存断点,恢复调用前的状态等工作,从而提高程序执行效率。但是,不可以都写成内联函数,因为这样会增加程序的长度,反而会降低效率的。所以,一般将比较短小的函数写成内联函数。使用内联函数的优点:从一个用户的角度来看,内联函数看起来和普通函数一样, 它可以有参数和返回转载 2020-08-28 19:32:20 · 163 阅读 · 0 评论 -
C学习:qsort排序算法对动态申请二维数组或字符串排序
C学习:qsort排序算法对动态申请二维数组排序二维数组排序字符串排序附:C代码在线调试工具相关推荐:C学习:qsort快排函数在二维数组中的灵活应用C学习:快排函数使用小结 qsort由于动态申请的二维数组相邻行的内存空间并不连续,所以会导致qsort()操作连续内存时有些变化,如不注意会导致报segment fault错误。对动态申请的不同字符串长度进行排序时,也有类似情况。下面结合实例代码进行分析。以下代码需包含头文件:#include <stdio.h>#includ原创 2021-04-26 16:40:57 · 1406 阅读 · 2 评论 -
C学习:qsort排序算法专用compare比较函数
C学习:qsort排序算法专用compare比较函数数组字符串结构体相关推荐:C学习:qsort快排函数在二维数组中的灵活应用C学习:快排函数使用小结 qsort说明:qsort()被包含在头文件 <stdlib.h>以下比较函数默认是升序排列,若想降序排列,交换函数实现里的a和b位置即可。qsort算法不具有稳定性,排序时,相同大小元素相对位置可能会发生改变。qsort只能针对不要求排序稳定性的场合使用,也即仅对元素排序,元素对应的位置没有意义。数组一维数组:// 对原创 2021-04-25 10:37:20 · 3584 阅读 · 0 评论 -
C学习:动态申请二维数组的方法
C学习:动态申请二维数组的方法二维数组动态申请三维数组动态申请所谓动态申请二维数组,即在某些场合,需要在程序运行阶段才能知道二维数组的行数和列数,从而在堆中动态分配内存给二维数组。当然,此思路也可以推广至动态申请三维、四维数组等。另外注意使用完数组后,不需要该数组时记得及时释放对应内存。二维数组动态申请话不多说,直接上代码:// 动态申请二维数组空间的方法int main(void){ int a[5][3] = {{1,4,-1},{3,2,3},{3,3,-2},{1,1,1},{4原创 2021-04-25 10:08:16 · 780 阅读 · 0 评论 -
C学习:绕不开的常用标准库函数及操作
C学习:绕不开的常用标准库函数及操作位操作字符串操作函数内存管理位操作~a, 取反a ^ b, 异或字符串操作函数strtok(), 字符串分割(不可重入,慎用)atoi(), 字符串转int整数,类似的还有atoll()strstr(), 字符串子串匹配strcpy(), 小字符串往大字符串全量拷贝strnpy(), 拷贝固定长度的字符串至目标字符串,可调节两个字符串偏移位置来实现灵活拷贝内存管理掌握4个常用的即可,内存大小单位均为Byte。malloc(), 从原创 2021-04-22 14:25:41 · 190 阅读 · 2 评论 -
C学习:逻辑运算和位运算易混点
C学习:逻辑运算和位运算易混点参考:C 运算符之逻辑关系运算、位运算特別注意这两个不常用的:~a 和 a^b,前者按位取反,后者按位异或运算(不同得1,相同得0)。为便于记忆理解 & 和 &&, | 和 || 的区别,可以理解为一个&表示对变量的按位操作,两个&&则考察变量整体来操作。位运算符~a; // 按位取反,一元运算, 1011 > 0100^a; // 异或操作 01=>1 10>1 00&g原创 2021-04-19 10:15:13 · 131 阅读 · 0 评论 -
C学习:一个负数补码把我整蒙了
负数补码的理解if (num < 0) { // 小于0,用补码,只要求到32位 // 逐步debug发现,取反位操作后,与预期不符,说明是在对本身负数存的补码在操作 // int val = (int)num; // 强制转成32位的 // printf("0x%x\n", val); // 0xfffffff6 // val = -val; // 以32位的长度进行操作 // printf("0x%x\n", val); // 0xa //原创 2021-04-17 16:13:26 · 704 阅读 · 3 评论 -
C学习:常用字符串操作函数之strtok()和strtok_s()
strtok,将字符串做分割;会改变输入的字符串,本质是将含有目标分割字符的字符都替换为\0返回切割后的字符串【a,b】指向a的指针。strtok内部涉及到malloc分割符最好声明成常量字符串:注意分隔符要声明成const不能改变其内容const char *delim = “:”;或者:const char split[2] = “,”; // 实际内存是: ,\0,分割符还含有\0,会出问题头文件:#include <string.h>函数签名:har * strtok(c原创 2021-04-17 16:09:01 · 647 阅读 · 0 评论 -
C学习:指针初始化的误区
C学习:指针初始化的误区小结你以为我理解指针了,不,你并没有……现象:有段关于指针的代码,遇到这种情况,编译通过,运行到指针语句就报错Segmentation fault.代码如下:short *seed = 0;*seed += 1024;预期:目的是想声明一个指针,并赋值0;下一步对该值加1024.实际:定义一个指针变量,并对其地址赋值为0。第一行代码等价于: short *seed; seed = 0;所以,第一行是有问题的,第二行ok。运行会报错Segmentation f原创 2021-04-09 15:42:49 · 127 阅读 · 0 评论 -
C学习:从extern深入了解声明和定义的区别
C学习:从extern深入了解声明和定义的区别1 背景2 报错现象3 原因分析3 解决起因来源于,在头文件中extern声明全局变量,编译报错。以下根据问题现象和分析来说明extern的用法,以及深入理解声明和定义的区别。1 背景在a.h中定义了结构体类型如下,typedef struct igf_enc_instance_struct{ IGF_ENC_PRIVATE_DATA igfData; int infoSamplingRate;原创 2021-04-01 20:19:38 · 178 阅读 · 0 评论 -
C学习:%p和%x、%lx、%hx、%llx区别辨析
%p和%x、%lx、%hx、%llx(对应int、long、short、long long)区别总结:%p 可以匹配对应类型的指针地址,输出以16进制表示,会自带前缀0x%x 可以对应int类型的指针,输出以16进制输出,不会自带前缀0x类似的,%lx,表示long类型指针,用16进制输出分析:当然,上面也可以用 %ld,表示将long类型的指针地址,强制用10进制输出%x只对应输出进制类型,具体的指针地址输出需要根据指针类型加修饰符%p就固定了用16进制,可以囊括不同类型的指针地址表达原创 2021-03-19 16:25:19 · 26743 阅读 · 4 评论 -
C学习:const的深入理解
const放在变量前表示为常量,值不可改变。那么当const与结构体或者其指针结合时该如何区分呢,指针不变还是指向的内容不变?原则:const放在*前,表示内容不变,放在*和变量中间,表示指针不变原创 2021-02-19 19:07:55 · 87 阅读 · 0 评论 -
C学习:数组名赋值给指针后地址算术运算辨析
取数组首位元素的地址和取数组名、取数组名的地址有啥区别呢?在指针赋值运算和内存取用时,极易出现bug,而且一般不会报错,但是不小心弄混后,隐藏bug较难排查。原创 2021-01-10 15:43:33 · 671 阅读 · 0 评论 -
C学习:整型提升规则辨析
C学习:整型提升规则辨析定义说明练习题目1题目2题目3题目4定义不同数据类型在混合运算时,时常会进行整型提升或者强制转换的操作,C语言中提升规则如下图:说明当short或者char类型数据进行混合运算时,统一都会转成int类型,根据左值的数据类型再做转换,所以一般不会有溢出或者截断现象。float/double类型向整型转换时,直接截断取整,去掉小数点后的数据。练习题目1下面两个if判断结果如何?unsigned int a = 20;int b = 13;int k = b -原创 2020-11-08 16:40:36 · 517 阅读 · 0 评论 -
C学习:有符号数类型的负数在计算机中的存储
C学习:有符号数类型的负数在计算机中的存储引子定义例子引子我们都知道正数在计算机中是转化成其二进制存储的,那么负数呢?计算机中,负数统一采用的补码形式存储。定义什么是补码呢?正数的补码就是该正数本身,负数的补码需要转化,规则如下:1>.对负数取绝对值,用二进制表示2>. 对每一位取反3>. 对该数加1简单来说,就是负数的补码为其绝对值取反后加1所得的结果。例子-1 , -2 作为有符号数其存储在内存的二进制到底为多少?负数以补码形式储存,而非其本身二进制本身,即符原创 2020-11-08 15:05:32 · 1723 阅读 · 0 评论 -
C学习:数组指针和指针数组辨析
数组指针与指针数组的区别辨析接触指针和数组时,经常容易搞混两者结合后的意义,这里结合自己的体会总结下。A) int *p1[10];B) int (*p2)[10];结论:A 为指针数组,全称为储存指针的数组。B 为数组指针,全称为指向数组的指针。也称行指针。分析:A中 p1先和[10]结合,成为数组,然后再和 * 结合,成为 int * 类型的数组,本质是数组,存储的数据是int *类型指针。当取固定间隔的指针地址后放入该指针数组,也可以模拟二维数组。B中p2先和()结合,成为指针 (原创 2020-11-07 11:32:43 · 180 阅读 · 0 评论 -
C学习:sizeof的用法理解
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等,并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小,即单位为Byte。原创 2020-11-07 10:31:45 · 1565 阅读 · 0 评论 -
C学习:qsort快排函数在二维数组中的灵活应用
C学习:qsort快排函数在二维数组中的灵活应用引入应用实现问题1:按某列大小来排各行的序问题2:按某列大小来排各行的序问题3:仅对二维数组某行排序完整测试代码引入在前一节中初步实现了在二维数组中按某列元素的大小来升序排列整个数组,这篇文章根据需求灵活应用qsort快排函数,辅以实例,增进理解。下面主要围绕以下几个问题讨论:如何按某列的元素大小来排各行的序?即横向排序各行。如何按某行的元素大小来排各列的序?即竖向排序各列。是否可以仅对二维数组某行或某列来进行排序?应用实现完整测试代码可以原创 2020-10-06 11:39:32 · 3780 阅读 · 9 评论 -
C学习:快排函数qsort使用小结
C语言快排函数使用小结 :qsort函数原型小例讲解应用实例函数原型void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))参数说明:base: 要排序的数组,如 int* 类型的指针或者数组首地址nmemb:数组元素个数,如 int a[12] 表示12个int类型元素size:每个元素所占内存空间,单位为字节byte,比如 int 类型通常为2 byte,常用si原创 2020-09-13 20:47:56 · 802 阅读 · 0 评论