![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c语言
enjoymyselflzz
这个作者很懒,什么都没留下…
展开
-
C中运算符简知
复合操作符 单目操作符 sizeof操作数的类型长度(以字节为单位) ~对一个数的二进制按位取反 - -前置- -后置- - ++前置++后置++ *间接访问操作符原创 2017-11-22 22:28:45 · 161 阅读 · 0 评论 -
memcpy函数实现
memcpy函数作用:将由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内,函数返回一个指向dest的指针特别说明:1.src和dest所指内存区域不能重叠2.与strcpy相比,memcpy遇到‘\0’并不会结束,而是一定会拷贝完n个字节3.memcpy可以拷贝任何数据类型的对象,可以指定拷贝的数据长度4.如果dest本身就有数据,执...原创 2018-07-23 12:53:02 · 15625 阅读 · 5 评论 -
memset函数实现
memset函数的作用:以dest为起始位置的n个字节的内存区域用整数set来进行填充,len为要填充的字节数,返回值为目标dest内存的起始地址特别说明:len表示的是字节数,函数是以字节的形式每次赋值给目标地址具体实现代码:#include<stdio.h>#include<stdlib.h>void *my_memset(void *dest, ...原创 2018-07-23 15:08:41 · 6988 阅读 · 2 评论 -
memmove
函数作用:用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域区域的字节拷贝到目标区域中,但复制后src内容会被更改,但是当目标区域与源区域没有重叠则和memcpy函数功能相同。memmove可以被分为三种情况:1.dest<src,源内存的首地址大于目标内存的首地址,进行正向拷贝,此时无需担心dest+coun...原创 2018-07-23 22:41:08 · 2051 阅读 · 0 评论 -
快速排序
大致思路:1 . 先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。核心思想:挖坑填数+分治具体实现:具体代码:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdl...原创 2018-07-24 15:48:24 · 151 阅读 · 0 评论 -
将字符串转换为整数
这是一道经典的面试题,在收到这样一道题时我们不要急于动手,先思考一下这道题的解决思路:1.在函数调用时我们需要用指针来接收数组的地址,那么指针是否需要判空?2.如果获取的字符串起始位出现“+”"-"号该如何处理?3.如果获取到的并非数字字符串该如何处理?4.如果获取的字符串正确,该如何返回成整数形式?5.如过获取的字符串带符号,返回的整数是否应该变为负数?理清了思路,下面我...原创 2018-07-19 11:01:10 · 251 阅读 · 0 评论 -
查找单链表倒数第K个结点
在这里我们介绍一种简单的思路:定义两个指针(fast和slow)都指向头结点,fast指针先走K-1次后slow指针再走,当fast->next==NULL的时候,slow指针指向的位置就是我们所要找的倒数第K个节点为了便于理解我们画图示意:在理解了思路后实现时还需要注意如下几个问题:1.空指针的判断,当链表的头指针为空时,这属于非法输入,应该直接返回2.当要查找倒数...原创 2018-07-19 14:25:34 · 1117 阅读 · 0 评论 -
共享栈的基本操作
共享栈的实现:如图,top1从0开始向右入栈,top2从maxsize开始向左入栈,这样就可以满足在一个数组中创建两个栈,同时也避免了空间的浪费基本操作我们分为:初始化栈、入栈、出栈、取栈顶元素,具体实现代码如下 1 #include<stdio.h> 2 #de...原创 2018-07-07 17:45:50 · 4894 阅读 · 0 评论 -
二维数组的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数解题思路:这个题有两种想法,第一种:遍历,以matrix[0][0]开始依次遍历二维数组中每一个元素直到找到待查找的数number为止,或者遍历完没有找到报错。第二种:因为数组是有序数组,那我们可以取右上角为起始点进行比较,比...原创 2018-07-19 17:30:54 · 147 阅读 · 0 评论 -
二叉搜索树
我们将查找分类可以分为如下几类:这节我们重点讲二叉搜索树,在讲之前我们先明白几个知识点:搜索:在数据元素集合中查找是否存在关键字等于某个给定关键字数据元素的过程搜索的结果:搜索成功、搜索失败用于搜索的数据集合称为搜索结构,由统一数据类型的元素组成,根据集合中数据的组织结构选择合适的搜索方法。二叉搜索树(二叉排序树):它或者是一棵空数或者具有如下的性质:若它的左子树不为空,那么左子树上所有节点的值都...原创 2018-07-13 20:06:46 · 102 阅读 · 0 评论 -
模拟实现strlen的三种方法
在模拟实现strlen之前我们首先要明白strlen的作用:1.计算字符串s的(unsigned int)型长度2.返回s的长度不包括"\0",这里要与sizeof加以区分实现思路:1.使用计数器count,每移动一次指针,count++,直到遇到“\0“”停止2.使用两个指针访问同一块(即该字符串)地址空间,一个指针保持不动,另一个指针不断遍历直到遇到“\0“”停止,两个指针...原创 2018-07-20 14:31:58 · 149 阅读 · 0 评论 -
模拟实现strcpy
strcpy函数的作用:把从src地址开始且含有‘\0’结束符的字符串复制到以dest开始的地址空间,返回值的类型为char *。实现思路:用while循环将src中的字符一个个赋值给dest,两个指针++具体实现代码:#include<stdlib.h>#include<stdio.h>char* my_strcpy(char*strdest, char...原创 2018-07-20 15:20:02 · 418 阅读 · 0 评论 -
模拟实现strcmp
strcmp函数的作用:比较两个字符串的大小。将两个字符串从左向右进行逐个字符比较(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。两个字符串相同时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值。具体实现代码:#include<stdio.h>#include<stdlib.h>int my_strcmp(char*strin...原创 2018-07-20 16:04:57 · 312 阅读 · 0 评论 -
图解选择排序
选择排序(升序排列):不稳定,时间复杂度 O(n^2)核心思想就是打擂台,初始状态我们默认选择第一个元素作为擂主,让它依次与其他元素比较,如果小于它,那么swap两个元素,依次类推,最后的元素就是按从小到大排列。具体实现步骤如图: 具体实现代码如下:void swap(int *a, int* b){ int tmp; tmp = *a; *a = *b; *b...原创 2018-07-26 19:42:35 · 707 阅读 · 0 评论 -
图解插入排序
插入排序(升序):稳定,时间复杂度 O(n^2)具体实现思路如图:具体实现代码如下:void InsertSort(int *a ,int len){ if (len <= 1) { return; } int count = 1; for (; count < len; count++) { int tmp = a[count]; int ...原创 2018-07-26 19:54:22 · 171 阅读 · 0 评论 -
图解希尔排序
希尔排序:不稳定,时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2具体实现思路如图:实现代码如下:void swap(int *a, int* b){ int tmp; tmp = *a; *a = *b; *b = tmp;}void ShellSort(int *a, int len){ if (len <= 1)...原创 2018-07-26 21:44:33 · 209 阅读 · 0 评论 -
模拟实现strcpy
在模拟实现strcpy前,我们要弄清楚strcpy的作用:字符串的拷贝,他是将源字符串拷贝到目标字符串,当遇到\0时停止。另外值得注意的一点是,strcpy获取的是源字符串和目标字符串的首地址。下面我们上代码#include<stdio.h>void my_strcpy(char *dest, char *src){ while (*src!='\0') { *dest =...原创 2018-03-14 13:10:56 · 181 阅读 · 1 评论 -
三子棋小游戏
用函数写了个三子棋小游戏text.c//游戏模块的测试#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu(){ printf("|----------------------------------------|\n"); printf("| |...原创 2018-03-12 17:09:23 · 107 阅读 · 0 评论 -
扫雷小游戏
游戏要求:1.打印一个可以更改大小的地图 2.雷的位置随机放置 3.当踩中雷后要立即提示并打印出所有的雷分布 4.当所有的雷排除完毕游戏才会终止game.c//游戏模块的实现#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void InitBoar...原创 2018-03-12 16:45:45 · 116 阅读 · 0 评论 -
c的起点
1.在初学者对c的接触中,最开始的函数无非是printf,main两种。printf函数的头文件是stdio.hmain函数是程序的起点,即没有main函数无法确定程序开始的位置,main函数有且仅有一个,此处很好理解,就像跑步比赛一样,只能有一个起点不然整个比赛都会乱套。对于main函数来说,不要写成void main()原创 2018-01-21 15:03:04 · 244 阅读 · 0 评论 -
一元二次方程的判断及根的求解
#define EXP 0.0000000001//此处为自定义的误差范围#include #include int main(){double a = 0.0;double b = 0.0;double c = 0.0;scanf("%lf %lf %lf", &a, &b, &c);if (a > -EXP&&a {printf("不是一元二次方程原创 2018-01-31 16:29:29 · 606 阅读 · 1 评论 -
对两个数组元素进行交换
在处理这个题时我们可以先参考两个变量之间值的交换,这时我们需要定义第三变量,对于两个数组之间元素的交换,无非是在此基础上附加了一个以数组为前提的条件,那我们只需要再添加一个for循环。利用i的变化完成每个元素之间的交换。此外还需要注意一点,数组的打印一定要引用for循环对其中每个元素进行打印。万万不可直接打印#define _CRT_SECURE_NO_WARNINGS 1#include原创 2018-01-31 16:40:09 · 8574 阅读 · 0 评论 -
基于goto语句的一个有趣的代码
对于goto语句来说,我们在进行使用时一定要确定一个目标点,即跳转的地方,我们标记为flag,下面是我写的一个趣味代码。要求:系统将在60秒后关机,当你输入我是猪后取消,输入任何其他语句都无法阻止关机。有兴趣的朋友也可以试试提示:60秒后关机语句system("shut down -s -t 60"); 字符串之间的比较strcmp(input, "我是猪") #in原创 2018-01-31 16:49:59 · 203 阅读 · 0 评论 -
求100~200以内的素数
以下的程序是较为基础的算法,还可以采用sqrt函数,素数都不是偶数的思想进行优化,不再一一列出代码。另外博主采用的是vs2013编译器#define _CRT_SECURE_NO_WARNINGS 1#includeint main(){int i = 0;int j = 0;int count = 0;for (i = 100; i {for (j =原创 2018-01-24 14:23:46 · 936 阅读 · 0 评论 -
打印乘法口诀表
要求按如下格式打印出9行9列的乘法口诀表:1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=9...#includeint main(){int i = 0;int j = 0;for (i = 1; i {for (j = 1; j {printf("%d*%d=%-2d ", i, j, i*j); //原创 2018-01-24 15:26:27 · 189 阅读 · 0 评论 -
判断1000~2000年之间的闰年
这里为了便于理解。粘贴最基础的代码。当然其中的判断条件我们可以用&&与||进行连接#includeint main(){int i = 0;int count = 0;for (i = 1000; i {if (i % 4 == 0){if (i % 100 != 0){printf("%d ", i);count++;}if (i %原创 2018-01-24 15:28:52 · 171 阅读 · 0 评论 -
完成1-1/2+1/3-1/4+......-1/100的计算
在我们面对这样的题目是第一反应应该是进行规律的查找总结,我们发现当分母为偶数时为负数,当分母为奇数时为正数,发现这个规律问题就变得简单。首先我们定义一个double类型的sum来存储总的计算结果,定义一个flag用来进行符号的变换,即flag=-flag来完成正负之间的转换,用for循环来完成分母1~100的输出。下面我们来粘贴代码:#includeint main(){dou原创 2018-01-31 16:56:22 · 2087 阅读 · 0 评论 -
对于a++与++a的思辨
a++:也就是我们通常所说的后置++,对于它的使用我们总结为先使用后进行++运算,下面我们以一道小代码来进行理解#include<stdio.h>int main(){int a=10;int b=a++;printf("a=%d b=%d",a,b);return 0;}这里的输出结果是a=11 b=10; 对程序进行分析:虽然b=a++但此时b的值并不是a的值加一,而是直接将a中...原创 2018-02-10 15:25:07 · 125 阅读 · 0 评论 -
做一个猜字小游戏
游戏要求:1.具备游戏菜单选项,选择1时开始游戏,选择0时退出游戏2.在进行猜数游戏时,系统随机生成一个数,由玩家进行猜测,系统根据玩家所猜数字进行相应的猜大猜小提示,使得玩家最终猜正确提示:在随机数的生成上面我使用了strand((unsigned int)time(NULL)来保证生成的数随机且不重复。 用while(1)使得玩家可以不断的进行猜测直到猜对为止原创 2018-02-05 19:12:28 · 394 阅读 · 0 评论 -
关于sizeof与strlen在数组中的应用
在了解sizeof与strlen在数组中的应用之前我们需要明确两个要点:1.除了sizeof(数组名)表示的是整个数组,&数组名表示整个数组的地址之外其余数组名均表示数组内首元素的地址2.strlen是从首元素开始直到\0才会停止,strlen接收的是地址下面我们通过例题来加深理解:1.对于整型一维数组#include<stdio.h>int main(){ int a[4] ...原创 2018-03-08 13:34:47 · 290 阅读 · 0 评论 -
静态库的打包与使用
在对函数的使用中为了简化我们的程序,我们可以选择将函数的声明以及函数的定义进行封装打包,组成我们可以重复使用的静态库,今天在本文中将详细介绍VS这类IDE中静态库的创建与使用方法。拿自己写的一个简单程序为例下面我们新建头文件与源文件将函数的声明与定义进行抽离新建项目,将拆分出的头文件与源文件导入,在项目属性的常规类型中将配置选项修改为静态库,此时就已经初步完成了静态库的创建,那么如何导入静态库呢?...原创 2018-02-28 16:33:24 · 348 阅读 · 0 评论 -
模拟实现strlen函数
对于srelen函数我们要明白一点,它获取的是字符串的首元素地址,即从第一个元素开始查找,知道遇到‘\0’,才会停止。这就要求我们模拟实现时用指针来接收地址。下面上代码#include<stdio.h>#include<string.h>#include<assert.h>my_strlen(const char*p){ assert(p != NUL...原创 2018-03-16 12:07:16 · 251 阅读 · 0 评论 -
完成对一个数组的重置、清零、逆序
这是一道简单的函数应用题,我们可以根据题目的要求定义出三个函数,分别表示重置、清零和逆序对于重置函数我们需要获取三个参数,一个为数组首元素地址、一个为数组大小、一个为需要重置成的数字对于清空函数,我们只需要获取两个参数,一个为数组首元素地址、一个为数组大小即可,我们可以用将0赋值给数组每个元素的形式,完成数组的清零对于逆序函数我们只需要获取两个参数,一个为数组首元素地址、一个为数组大小,但需要注意...原创 2018-03-02 17:20:27 · 2617 阅读 · 0 评论 -
实现Linux下的cp命令
cp命令的作用:读取源文件写到目标文件具体实现思路:1.打开源文件,先判断argc==3,argv[0]为可执行程序的名字,argv[1]为源文件,argv[2]为目标文件2.当源文件存在的时候用O_EXCL进行一次提示3.当源文件与目标文件都正确打开后,循环读取源文件写入目标文件4.完成实现后可以用vimdiff 文件A 文件B 可以比较两个文件相同与否具体实现代码:...原创 2018-08-01 17:09:12 · 1901 阅读 · 0 评论