
C语言从入门到入土
文章平均质量分 86
C语言的学习之路
无聊看看天T^T
事以密成,语以泄败
展开
-
VM安装出现 EULAS_AGREE = 1 及后续问题的解决办法
VM的安装总会出现各种各样的奇怪问题,我们在这里要解决的就是在VM重装时遇到的 EULAS_AGREE = 1问题,以及出现后续问题的解决办法原创 2023-09-01 09:39:42 · 2031 阅读 · 1 评论 -
常用Win32 API的简单介绍
主要涉及了贪吃蛇项目中会用到的Win32 API(都挺有意思的)......原创 2023-10-23 23:26:36 · 1583 阅读 · 0 评论 -
贪吃蛇的实现
这里除了有贪吃蛇项目的所有代码,还有每种运行所需函数的详细内容介绍以及可能出错的原因及解决办法,项目所需的额外知识,你想的到的想不到的都在这里......原创 2023-10-27 18:54:05 · 360 阅读 · 0 评论 -
C语言的fabs函数与fmax函数(了解)
返回其参数中较大的参数。原创 2023-12-23 00:34:10 · 1233 阅读 · 0 评论 -
C语言的词法陷阱(一般)
针对C语言中可能出现的一些基本的语法错误进行了列举与分析......原创 2023-11-30 23:57:35 · 861 阅读 · 0 评论 -
C语言的语义缺陷(一)(一般)
在一个句子,哪怕其中的每个单词都拼写正确,而且语法也无懈可击,仍然可能有歧义或者并非书写者希望表达的意思。程序也有可能表面上是一个意思,而实际上的意思却相差甚远。本篇讲述了几种可能引起上述歧义的程序书写方式。原创 2023-12-06 23:56:27 · 1249 阅读 · 0 评论 -
C语言的词法陷阱(了解)
要理解一个C程序,仅仅理解组成该程序的符号,程序员还必须理解这些符号如何组成声明、表达式、语句和程序的。虽然这些组合方式的定义都很完善,几乎无懈可击,但有时这些定义与人们的直觉相悖,或者容易引起混淆。本篇将讨论一些用法和意义与我们想当然的认识不一致的语法结构。原创 2023-12-03 23:18:57 · 996 阅读 · 0 评论 -
<C语言错误处理> strerror和perror函数以及断言处理方式(了解)
本篇主要讲了perror函数、strerror函数以及断言的使用方法,同时引入了C89标准、C99标准以及C1X标准下对assert断言的不同要求......原创 2023-11-27 23:53:35 · 1042 阅读 · 0 评论 -
C语言之“可变参数与<stdarg.h>头文件”(了解)
关于如何利用头文件提供给我们的三个宏定义,实现可变参数的函数的使用......原创 2023-11-29 14:51:09 · 959 阅读 · 0 评论 -
<C语言错误处理> <errno.h>头文件与<error.h>头文件(了解)
C语言的错误处理一共分为三个部分:错误号处理方式、断言处理方式、边界检查方式,我们将这三部分分为三篇文章来写,本篇主要讲述了错误号处理方式中的头文件以及其中常见的宏,以及GUN C库中的头文件,最后还进行了一些必要错误码的补充......原创 2023-11-27 20:33:34 · 3780 阅读 · 0 评论 -
C语言的命令行参数(重要)
也称命令提示符、命令行界面,CLI,是一种基于文本的用户界面,通过输入命令来与操作系统或程序进行交互。指的是在运行可执行文件时提供给程序的额外信息,通常以字符串形式出现,并且紧跟在可执行文件后,且在使用时需要在命令行终端下输入命令。如果不确定可执行文件的名称及所在路径,可以先F5运行一下程序看一下该程序生成的可执行文件的所在路径以及文件名。(演示完这里就不再演示Windows提供命令行终端了,且这里只演示cmd的)进行命令行传参前要保证当前所在路径是要被传参的可执行文件的所在路径。是一个字符指针数组,原创 2023-12-08 17:36:17 · 4231 阅读 · 6 评论 -
c语言知识的重新整合(一)(了解)
整数的三种二进制表示方法叫做原码、反码和补码(无符号数没有原反补的概念)三种方法均有符号位和数值位两部分组成,符号位为0表示负整数,符号位为1表示正整数,其中,符号位为整数二进制表示中的最高位(左边第一个),其余的二进制位都为数值位。正整数的原码、反码和补码均相同,且符号位固定为1负整数的原码、反码和补码均不同,且符号位固定为0对于整型来说数据存放在内存中起始是补码的原因是:使用补码,可以将符号位和数值域统一处理;原创 2023-09-22 20:24:46 · 128 阅读 · 0 评论 -
<C语言错误处理> 非局部跳转<setjmp.h>头文件(了解)
关于setjmp宏与longjmp函数的使用方法,以及具体案例......原创 2023-11-28 20:44:44 · 1069 阅读 · 0 评论 -
C语言知识的重新整合(二)(了解)
define机制包括了⼀个规定,允许把参数替换到⽂本中,这种实现通常称为宏(macro)或定义宏其中的 parament-list 是⼀个由逗号隔开的符号表,它们可能出现在stuff中。参数列表的左括号必须与name紧邻,如果两者之间有空⽩,参数列表就会被视为stuff的⼀部分int main()int a = 5;return 0;return 0;原创 2023-09-28 22:16:00 · 218 阅读 · 0 评论 -
<C语言错误处理> <signal.h>头文件及signal函数(了解)
关于头文件中的信号宏、signal函数的使用及其案例、预定义的信号处理函数、raise函数的使用及其案例......原创 2023-11-28 18:30:11 · 1734 阅读 · 0 评论 -
编译和链接(重要)
ANSI C(American National Standards Institute C)是指按照美国国家标准协会(ANSI)定的C语言标准。在1989年,ANSI制定了一套C语言标准,该标准通常被称为ANSI C或C89(为了区别于后续的标准C99)。ANSI C标准被国际标准化组织(ISO)接受,并以ISO/IEC 9899:1990的形式发布。所以,ANSI C和ISO C代表的是同一种标准。第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)第二种是。原创 2023-09-27 21:01:46 · 115 阅读 · 0 评论 -
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字
printf("a的取值范围为0至9,请重新输入!//规定当a的取值范围在0至9时程序才能正常运行。//将每次所得的每一项相加,最后输出。//n代表要求前几项之和。//sum表示最终结果。//确保可以进行多组输入。//a是要填入的数字。原创 2023-09-06 12:54:59 · 113 阅读 · 1 评论 -
C语言指针精简版(三)(重要)
函数指针数组就是把多个函数的地址存放在一个数组中返回类型(*数组名[函数个数])(形参类型,形参类型) = (函数名,函数名)其中,parr1 [3]表示一个有三个元素的数组,数组类型就是 int (*)(int,int) ,指向(int,int)返回值是int型的函数指针变量,数组元素为Add 和 Sub。原创 2023-10-20 20:44:26 · 249 阅读 · 0 评论 -
time函数 && rand函数 && srand函数(一般)
C语言rand为什么被称为伪随机函数?真随机函数又该如何实现?如何利用随机函数实现猜数字游戏?在这里你都可以找到答案......原创 2023-09-06 23:09:49 · 266 阅读 · 2 评论 -
S-DES加密算法的分析与代码实现(C语言)
S-DES(Simplified-DES)是DES算法的简易版本,该算法作用于8比特的数据分组,初始密钥为10比特的数据分组。初始有效密钥首先进入PC-1置换,并分为C0、D0两部分,每部分5比特;两部分分别循环左移1位,得到C1、D1;C1、D1经过PC-2置换后得到子密钥k1;原创 2024-01-15 23:43:59 · 2492 阅读 · 12 评论 -
C语言指针精简版(二)(一般)
⼀维数组传参,传递的是数组首元素地址,形参的部分可以写成数组或指针的形式冒泡排序。原创 2023-10-20 19:08:07 · 359 阅读 · 0 评论 -
C语言常见知识点汇总(二)(重要)
第二个字节比较麻烦,首先ucData0给了3其实是越界了,1位的数字只能是0或1,所以0011截断后只有1,同理ucData1给的4也是越界的,0100截断后是00,只有5的0101是正常的,填充序列是类似小端的低地址在低位,所以排列顺序是0010 1001,即0x29,最终结果为02 29 00 00。结构体向int对齐,7个short一共是14字节,对齐后是16字节。union只有2字节,2字节的十六进制只有4位,而位顺序类似小端,低地址在低处,所以39是低地址,在低位,38在高位,所以是3839。原创 2023-11-12 21:50:46 · 359 阅读 · 1 评论 -
函数的递归(一般)
!!递归就是函数自己调用自己!!!//main函数中⼜调⽤了main函数return 0;//这里只是做一个简单的示例,这种写法是错误,会使程序陷入死递归导致Stack overflow(栈溢出)。递归的思想:把⼀个⼤型复杂问题层层转化为⼀个与原问题相似,但规模较⼩的⼦问题来求解;直到⼦问题不能再被拆分,递归就结束了,即就是把⼤事化⼩的过程。原创 2023-08-12 01:51:10 · 298 阅读 · 1 评论 -
函数帧栈的创建和销毁(一)(了解)
我们在写C语言代码的时候,经常会把一个独立的功能抽象为函数,所以C程序是以函数为基本单位的。那函数是如何调用的?函数的返回值又是如何待会的?函数参数是如何传递的?这些问题都和函数栈帧有关系。函数栈帧(stack frame)就是函数调用过程中在程序的调用栈(call stack)所开辟的空间,这些空间是用来存放:函数参数和函数返回值临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)保存上下文信息(包括在函数调用前后需要保持不变的寄存器)理解函数栈帧能解决什么问题。原创 2023-12-20 23:33:46 · 899 阅读 · 0 评论 -
内存处理函数(重要)
当我们完成1和2与3和4的拷贝时,3和4的内存空间其实已经变成1和2了,所以当我们想把原来3和4位置上的数拷贝给5和6时其实是将1和2重新拷贝给了5和6,此时5和6的内存空间也变成了1和2,7和8的情况也是一样的,只不过num=20所以8侥幸逃过一劫。运行开始前我们点击”调试“-”窗口“-”内存“,随机选取一个内存窗口,同时打开监视窗口,当程序运行至return 0时我们会发现内存中只有1、2、3、4、5发生了改变,而20 * sizeof(int) == 5。将内存中的值以字节为单位设置成想要的内容。原创 2023-09-13 15:33:13 · 124 阅读 · 1 评论 -
三子棋小游戏
三子棋作为一款简单而有趣的策略棋盘游戏,不仅能带来欢乐和挑战,还能培养思维技巧。通过示例代码以及上述提到的各种参考建议,在实践中体验并掌握这个经典小游戏。快来挑战自己,在三子棋中展现你独特而精彩的思维!~over~原创 2023-10-08 15:52:18 · 72 阅读 · 0 评论 -
数据在内存中的存储 && 浮点数与整数的类型转换(重要)
大小端是指在多字节数据类型(如整数、浮点数)的存储过程中,字节的排列顺序为什么要有大小端字节序?因为如果当一个数值占用的内存空间超过一个字节时,它存储在内存中时就会面临字节的存储顺序问题,比如int a = 0x11223344,它在内存中的存储顺序就有十六种.....这只是其中的三种,其实这些存储顺序都没有什么问题,但是当我们读取这些内容的时候就会出现要先读取哪一个字节的问题,所以我们引入了大小端字节序的概念来规范字节在内存中的存储顺序。原创 2023-09-14 10:28:33 · 469 阅读 · 2 评论 -
c语言的进制转换 与 整型提升(重要)
整数的三种二进制表示方法叫做原码、反码、补码,三种方法均有符号位和数值位两部分,符号位都是用0“表示正”,用1表示“负”,而数值位最高位的一位被当作是符号位,其余的都是数值位(移码的符号位另算)正整数的原码、反码、补码均相同,且符号位固定为1负整数的原码、反码、补码均不同,且符号位固定为0整型在内存中是以补码的形式存在的,在内存中的运算也都是二进制的补码之间在运算(如果要解释为什么,那么要解释内容会很多就不做过多解释了)原码反码补码移码真值为正符号位变为0,其余各位不变同原码同原码。原创 2023-08-07 19:21:41 · 2384 阅读 · 0 评论 -
动态内存管理(重要)
目录为什么要有动态内存分配malloc函数free函数calloc函数realloc函数常见的动态内存的错误对空指针的解引用操作free掉部分动态开辟的内存动态开辟内存未释放(内存泄漏)动态内存经典笔试题:柔性数组柔性数组的使用内存碎片: C/C++中程序内存区域划分函数原型:void* malloc(size_t size);作用:向内存申请一块连续可用的内存空间,并返回指向这块内存空间的指针包含头文件:注意事项:1、返回的是无类型指针void*,在使用时一定要强制转换为所需要的类型2原创 2023-09-24 21:20:35 · 195 阅读 · 0 评论 -
atoi函数及其模拟实现(一般)
通过这样的判断条件组合, 我们可以更准确地检测是否发生了溢出,并及时处理它们。这样能够保证转换后得到的结果在合理范围内,并避免由于数据过大而导致的错误。),那么再追加下一位数字就会导致溢出。因此,直接返回适当符号乘以整数类型的极限值(正负都可以)。),那么再追加一个数字也会导致溢出。同样地,在这种情况下返回适当符号乘以整数类型的极限值。这个上限值告诉我们,在追加下一位数字之前,当前结果最多只能达到。在判断溢出时,我们可以直接将当前结果。首先,我们将整数类型的最大值。(即结果超出整数范围)原创 2023-11-16 21:58:11 · 97 阅读 · 0 评论 -
#define宏(重要)
define 常量名 值或表达式1、定义常量defineMAX 1000define2、简化名称define//为register这个关键字,创建⼀个简短的名字3、效果替换define;//⽤更形象的符号来替换⼀种实现for(;;)中判断条件为空则语句陷入死循环4、简略代码defineCASE break;case//在写case语句的时候⾃动把break写上5、如果定义的stuff过⻓,可以分⾏写,除了最后⼀⾏外,每⾏的后⾯加⼀个反斜杠(续⾏符)原创 2023-10-02 19:32:10 · 593 阅读 · 0 评论 -
字符旋转及逆序输出问题
首先,我们得先写出一个函数用于翻转我们给的第一个字符串s1,然后再让翻转后的s1与我们提供的第二个字符串s2做最后比较。对于字符翻转函数内部的具体翻转过程如下图:我们会发现当进行第四次翻转时,字符串就会回到原来的位置,当我们进行第五次翻转时其实就相当于它翻转了一次,所以我们会想到使用。原创 2023-09-06 11:43:33 · 153 阅读 · 1 评论 -
杨辉三角问题
由于我们在填第n行的杨辉三角时,只跟第n-1行的杨辉三角产生联系,不会跟之前的有联系,所以没必要保存每一行的杨辉三角,填一行打一行就行了。当i = 2时,arr[3][1] = arr[2][1] + arr[2][0]、arr[3][2] = arr[2][2] + arr[2][1];令i = 1,j =1 是为了从杨辉三角第三行的第二个数字开始打印,因为第一二行全为1且每一行第一个数字也为1。当i = 1时,arr[2][1] = arr[1][1] + arr[1][0];原创 2023-09-04 22:51:44 · 1163 阅读 · 1 评论 -
杨氏矩阵( 时间复杂度小于O(N) )
右上角开始查找的时候,右上角的元素比我们要查找元素小,我们就可以去掉右上角元素所在的这一行;右上角的元素比我们要查找的元素大,我们就可以去掉右上角元素所在的这一列。方法一虽然可以得到正确结果,但是问题也很明显,就是我们每次查找都需要重新遍历一次数组,如果数组元素较少还可以接收,但是如果数组元素过多就会降低查找效率不能满足时间复杂度小于O(N)的题目要求,所以我们想到了方法二。我们仔细分析,不难发现,对于杨氏矩阵来说,右上角和左下角的元素是有特点的:右上角的元素是一行中最大的,一列中最小的。原创 2023-09-05 10:28:53 · 128 阅读 · 0 评论 -
Qsort排序函数 及基于qsort排序函数实现的通用冒泡排序(重要)
对指向的数组中的数组元素进行快速排序stdlib.hbase: 指向需要排序的数组首元素的指针num: 数组中元素个数size: 每个元素大小(以字节为单位)compar: 比较函数,用于确定两个元素之间的顺序关系第一个参数小于第二个参数,返回负数两个参数相等,返回零第一个参数大于第二个参数,返回正数Void*类型的指针是通用指针,可以接受任意类型的地址。原创 2023-11-05 21:44:57 · 282 阅读 · 0 评论 -
C语言的文件操作函数(重要)
⽂件在读写前后需要进行文件的打开和关闭操作,在打开⽂件时,会返回⼀个FILE*的指针变量指向该⽂件,相当于建⽴了指针和⽂件的关系。因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件,如果不做,可能导致读写⽂件的问题。比如整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节)的返回值是成功读取的元素个数,在发生错误或到达文件末尾时返回一个小于请求元素个数的值。当成功获取当前文件位置时,返回当前文件位置的字节偏移量。原创 2023-09-27 14:58:40 · 156 阅读 · 0 评论 -
扫雷游戏的实现
假设我们排查(2,5)这个坐标时,我们排查的是周围⼀圈8个⻩⾊位置,统计周围雷的个数是1;假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的3个黄色位置就会越界,为了防⽌越界,我们在设计的时候,将数组扩⼤⼀圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。如果点击非雷位置那么在显示这个位置周围雷的个数的同时也会随机的扫出一片非雷位置(该功能需要利用递归思想),当所有非雷位置全部被找出时,排雷成功游戏结束,同时显示所有雷的位置。原创 2023-08-02 00:05:59 · 375 阅读 · 0 评论 -
offsetof宏的使用及其模拟实现(重要)
主要是对 (size_t)&(((struct_type*)0)->mem_name)这段代码的解释,涉及编译器对空指针的隐式行为......原创 2023-11-06 21:11:53 · 369 阅读 · 0 评论 -
函数栈帧的创建和销毁(二)(了解)
在上篇内容中,对函数栈帧的创建和销毁有了基本的了解,现在我们更加深入的了解它......原创 2023-12-21 16:39:41 · 890 阅读 · 0 评论 -
结构体的内存对齐 && 位段(重要)
结构体是由一系列具有相同或不同类型的数据构成的数据集合,也叫结构,它是一种数据类型当我们描述一个人的年龄时我们可以使用,int age = 18;但是如果我们要描述一个人呢?很显然我们无法仅靠一个age就实现对一个人的描述,所以就有了结构体,在结构体中我们可以包含多种类型的数据,这样就可以实现对一个人的描述比如身高、爱好、体重等等。原创 2023-09-18 16:12:53 · 195 阅读 · 0 评论