![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
文章平均质量分 77
WoLannnnn
沉淀……
展开
-
C语言可变参数
可变参数可变参数顾名思义,就是函数参数列表的参数数量是可变的,我们常见的使用可变参数的函数有 scanf 和 printf可变参数的使用我们先看一个带有可变参数的函数:void func(int num, ...){ ;}第一个参数 num 还是一个固定参数,后面的 ... 就表示可变参数。通常来说,我们需要在传参时传一个固定参数,来标识可变参数的个数,这对我们使用可变参数的宏是很重要的。下面是使用可变参数的几个相关宏:typedef char * va_list; // 可变参原创 2022-05-10 09:30:47 · 451 阅读 · 12 评论 -
进程间通信——共享内存
system V共享内存共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据共享内存示意图理解:共享内存是物理内存中开辟给进行通信的进程之间的共享内存,这样一个进程向内存里写了什么,另一个进程就能马上看到,因为它们都把共享内存当成了自己应有的内存,所以能够进行通信,并且减少了拷贝次数。共享内存数据结构struct shmid_ds {struct ipc_perm shm_per原创 2022-01-22 19:56:46 · 340 阅读 · 8 评论 -
进程等待与程序替换
进程等待子进程被创建,谁先运行谁先退出?谁先运行,是由调度器说了算那谁先退出呢?一般来说,我们通常要让子进程先退出。因为父进程可以很容易对子进程进行管理(垃圾回收).子进程处理业务,需要让父进程帮我们拿到子进程执行的结果所以,一般子进程是需要被等待的,具体是被父进程等待进程等待必要性之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已原创 2022-01-21 08:00:00 · 425 阅读 · 14 评论 -
理解文件系统及动静态库
理解文件系统我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据[root@localhost linux]# ls -l总用量 12-rwxr-xr-x. 1 root root 7438 "9月 13 14:56" a.out-rw-r--r--. 1 root root 654 "9月 13 14:56" test.c每行包含7列:权限硬链接数文件所有者组大小最后修改时间文件名ls -l读取存储在磁盘上的文件信息,然后显示出来其实这个信息除了通过这原创 2022-01-20 19:03:37 · 1458 阅读 · 8 评论 -
Linux文件接口及文件描述符
系统文件I/O操作文件,除了C接口(当然,C++也有接口,其他语言也有),我们还可以采用系统接口来进行文件访问写文件:#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <string.h>int main(){ umask(0); int原创 2022-01-20 19:00:40 · 1110 阅读 · 6 评论 -
进程的创建与终止
文章目录进程创建fork函数初识fork函数返回值#fork为什么有两个返回值写时拷贝写时拷贝的触发如何理解子进程的创建fork常规用法fork调用失败的原因进程终止进程退出场景进程常见退出方法exit函数_exit函数exit和_exit的工作:return退出exit() vs return进程创建fork函数初识在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。#include <unistd.h>pid_t fork(原创 2022-01-18 20:28:14 · 900 阅读 · 20 评论 -
Linux权限
文章目录Linux权限的概念Linux权限管理文件访问者的分类(人)文件类型和访问权限(事物属性)文件权限值的表示方法1)字符表示方法2)8进制数值表示方法文件访问权限的相关设置方法a)chmodb)chown关于sudoc)chgrpd)umaskfile指令:目录的权限粘滞位关于权限的总结Linux权限的概念Linux下有两种用户:超级用户(root)、普通用户。超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情。超级用户的命令提示符是“#”,普通用户的命原创 2021-11-06 11:15:47 · 728 阅读 · 9 评论 -
理解常用的八个排序
文章目录排序的概念及其运用排序的概念排序运用常见的排序算法插入排序希尔排序选择排序堆排序冒泡排序快速排序左右指针法三数取中法挖坑法前后指针法小区间优化法非递归实现快排归并排序非递归实现内排序与外排序计数排序排序的概念及其运用排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序原创 2021-09-19 17:30:49 · 1516 阅读 · 10 评论 -
数据结构——队列的链式结构实现
文章目录队列队列的概念及结构队列的实现——链式结构队列队列的概念及结构大家买过茶颜悦色的话想必就知道排队的队伍是多么庞大了队列就像我们平时排队的特点一样,排在前面的先买到奶茶。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out,也就是先进先出) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头队列的实现——链式结构队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果原创 2021-09-16 14:13:26 · 342 阅读 · 2 评论 -
数据结构——栈的实现
文章目录栈栈的概念及结构栈的实现栈栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out,也就是后进献先出)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。栈的实现栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。如果选择单链原创 2021-09-15 13:23:54 · 222 阅读 · 4 评论 -
二叉树的实现及基本操作
文章目录二叉树链式结构的实现二叉树的遍历前序、中序以及后序遍历层序遍历二叉树链式结构的实现基本功能BinaryTree.h:typedef char BTDataType;typedef struct BinaryTreeNode{ BTDataType _data; struct BinaryTreeNode* _left; struct BinaryTreeNode* _right;}BTNode;//创建节点BTNode* BuyNode(BTDataType x);/原创 2021-09-14 23:09:29 · 1083 阅读 · 2 评论 -
堆的实现及应用
文章目录堆的概念及结构堆的实现堆向下调整算法堆的创建堆的插入堆的删除堆的代码实现堆的应用堆排序TOP-K问题堆的概念及结构如果有一个关键码的集合K = 把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: 2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆的性质:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。堆的实现堆向下调整算法假设父亲的下标是parent,左孩子的下标leftchild就原创 2021-09-02 21:47:28 · 750 阅读 · 3 评论 -
数组形式的整数加法
989. 数组形式的整数加法对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。思路(本人的菜鸡思路): 计算出k的位数大小ksize,开辟一个数组retarr,大小为numSize和ksize中的较大值加1,加1是考虑进位的情况。随后对每位进行相加,将结果返回。如何实现每一位的相加呢?我们从k的末位及数组的末尾开始相加,但要将结果%1原创 2021-08-30 19:28:06 · 1235 阅读 · 2 评论 -
剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 58 - II. 左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0CHBTk8-1629898148440)(C:\Users\晏思俊\AppData\Roaming\Typora\typora-user-images\image-20210原创 2021-08-25 21:29:53 · 84 阅读 · 1 评论 -
剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。思路: 用一个额外的空间,并使用双指针,left指向新空间的开头,right指向原字符串的末尾(不是*’\0’*)。让right跳过空格,遇到非空格字符时,就遍历该段非空格字符串,并用计数器count计算该段的长度,当right又指向空格时,计算结束,使原创 2021-08-24 21:09:05 · 246 阅读 · 7 评论 -
剑指 Offer 57. 和为s的两个数字
剑指 Offer 57. 和为s的两个数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。限制:1 <= nums.length <= 10^51 <= nums[i] <= 10^6思路一:二分查找,遍历数组元素,遍历时得到target与每个元素的差值,再用二分查找在数组里从当前元素开始向后找差值。假设某个数组元素为nums[i],差值founder = target - num[i],原创 2021-08-23 18:32:23 · 158 阅读 · 5 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I统计一个数字在排序数组中出现的次数。**思路一:**直接遍历数组,找到目标数字后进行统计代码:int search(int* nums, int numsSize, int target){ if (numsSize == 0) { return 0; } //数组中不含target if (target < nums[0] || target > nums[numsS原创 2021-08-22 23:20:48 · 152 阅读 · 3 评论 -
剑指 Offer 50. 第一个只出现一次的字符
剑指 Offer 50. 第一个只出现一次的字符在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = "abaccdeff"返回 "b"s = "" 返回 " "**思路:**开辟一个int数组arr,将内容初始化为0。以字符串的每个字符对应的ASCII码值作为数组下标,字符每出现一次就对数组的内容+1,也就是arr是用来统计每个字符出现的个数的,最后找到第一个出现一次的字符。统计完成后,不能以遍历arr的方式找到第一个出现一次的字符,因原创 2021-08-20 13:36:00 · 113 阅读 · 0 评论 -
剑指 Offer 49. 丑数
剑指 Offer 49. 丑数我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明:1 是丑数。n 不超过1690。**思路:**因为丑数的质因子只有2、3、5,所以大一点的丑数一定可以由2或3或5相乘得到使用三指针p2、p3、p5,创建丑数数组从小到大存放丑数,p2、p3、p5则按从小到大的原创 2021-08-19 13:51:53 · 167 阅读 · 4 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
剑指 Offer 48. 最长不含重复字符的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,原创 2021-08-18 11:57:39 · 164 阅读 · 4 评论 -
剑指 Offer 47. 礼物的最大价值
剑指 Offer 47. 礼物的最大价值在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物**思路:**遍历礼物方格,对所在位置左边和上面较大的值原创 2021-08-17 22:45:06 · 181 阅读 · 3 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2思路一:利用qsort函数,先排序,再找到下标为size(数组长度) / 2 的元素,秒杀代码:int cmp(const void*s1, const void*s2){ return *((int*)s1) - *((int*)原创 2021-08-17 11:25:09 · 93 阅读 · 0 评论 -
剑指offer——包含min的子结构题解
剑指 Offer 30. 包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top()原创 2021-08-12 10:48:19 · 128 阅读 · 2 评论 -
树的子结构
剑指 Offer 26. 树的子结构不同于判断一棵树是否为另一棵树的子树,这题的判断条件有所不同题目:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \ 1 2给定的树 B: 4 / 1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。示例 1:输入:A = [1,2,3], B = [3,1]原创 2021-08-10 22:10:23 · 170 阅读 · 3 评论 -
链表的结构
文章目录1.1 链表的概念及结构1.2 链表的分类1.3 链表的实现1.4 双向链表的实现1.1 链表的概念及结构概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的链表结构在逻辑上是连续的,但是在物理上不一定是连续的现实中的结点一般都是从堆上申请出来的从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续假设在32位系统上,节点中 值位int类型,则一个节点的大小为8个字节,则也有可能有下述链表:1.2 链原创 2021-08-05 15:33:41 · 1740 阅读 · 1 评论 -
链表12道经典OJ题——助你理解链表原理
文章目录1.移除链表元素2.反转链表3.链表的中间结点4.链表中倒数第k个结点5.合并两个有序链表6.链表分割7.链表的回文结构8.相交链表9.环形链表10.求环的入口点11.复制带随机指针的链表12.对链表进行插入排序注:部分图片从leetcode转载后面偷懒了,有些图没画个人认为11题是难度较高的题,如果有大佬觉得不过如此,还望指导指导1.移除链表元素OJ链接给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新原创 2021-08-05 15:32:00 · 713 阅读 · 5 评论 -
一些简单的文件操作
文章目录**文件名****文件类型****文件指针****文件的打开和关闭****文件的顺序读写**fputcfgetcfputsfgetsfprintffscanffwritefread**对比一组函数:****文件的随机读写**fseekftellrewind**文件结束判定**文件名一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀例如: c:\code\test.txt为了方便起见,文件标识常被称为文件名。文件类型根据数据的组织形式,数原创 2021-07-24 11:19:04 · 194 阅读 · 1 评论 -
c语言实现静态与动态通讯录
文章目录**通讯录实现1.0**(静态版本)contact.h:包括函数的声明,#define定义的一些常用数字以及结构体的定义contact.c:函数的具体实现test.c:通讯录的操作选择的实现**通讯类实现2.0(利用动态内存开辟节省空间)**通讯录实现1.0(静态版本)contact.h:包括函数的声明,#define定义的一些常用数字以及结构体的定义#include<stdio.h>#include<string.h>//将这些信息的最大值用宏的方式定义,之后便原创 2021-07-20 11:32:20 · 408 阅读 · 3 评论 -
浅谈C语言的动态内存开辟
文章目录**动态内存函数的介绍**mallocfreecallocrealloc**常见的动态内存错误****几个经典的笔试题****C/C++程序的内存开辟****柔性数组****柔性数组的特点****柔性数组的使用****柔性数组的优势****C语言结构体里的数组和指针**为什么存在动态内存分配我们已经掌握的内存开辟方式有:int val = 20;//在栈空间上开辟四个字节char arr[10] = {0};//在栈空间上开辟10个字节的连续空间但是上述的开辟空间的方式有两个特点:原创 2021-07-20 11:25:15 · 392 阅读 · 7 评论 -
C语言结构体及其内存对齐、枚举、联合的介绍
c语言中允许自己创建类型,有结构体,枚举及联合体,以下就是对这三种自定义类型的讲解文章目录结构体**结构体内存对齐****结构体传参**位段**位段的内存分配****位段的跨平台问题**枚举类型**枚举的优点****枚举的使用****联合(共用体)****联合的特点****联合大小的计算****联合的应用**结构体结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构的声明struct tag{ member-list; }variable-list;例如描原创 2021-06-15 20:08:43 · 368 阅读 · 7 评论 -
C语言中memcpy、memmove等内存函数的介绍
我们知道,字符串中有一些对应的操作函数,如strcpy,strcmp等等,那么这些只适用于字符串,其他类型的数组该怎么实现这些操作呢?本篇文章就介绍了一些常用的内存操作函数文章目录memcpymemmovememcmpmemsetmemcpymemmovememcmpmemset...原创 2021-06-13 12:30:50 · 490 阅读 · 3 评论 -
c语言strcpy、strcmp、strcat等常见字符操作函数的介绍
字符串是c语言中一种常见的数据类型,字符串属于常量,不可修改,如果我们想要修改,就要把它放在字符数组中来对其进行修改,而有一些函数可以帮助我们完成一些常用的操作字符串的动作,下面我们就来介绍一些常用字符串操作函数文章目录strlenstrcpystrcatstrcmpstrncpystrncatstrncmpstrstrstrtokstrerrorstrlenstrcpystrcatstrcmpstrncpystrncatstrncmpstrstrstrtokstrerror...原创 2021-06-12 15:09:13 · 1798 阅读 · 5 评论 -
连续熬夜爆肝C指针,你想知道的这里都有
文章目录野指针指针和数组字符指针数组指针数组名的意义如何使用数组指针数组与指针的传参二级指针指针数组函数指针函数指针数组指向函数指针数组的指针回调函数一些指针和数组练习野指针概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的野指针成因指针未初始化#include <stdio.h>int main(){ int *p;//局部变量指针未初始化,默认为随机值*p = 20;return 0; }指针越界访问#include &原创 2021-06-04 14:39:41 · 327 阅读 · 7 评论 -
C语言%u、%d打印的规则、数据在内存中的存储及大小端存储模式
大小端、%u、%d打印的规则、数据在内存中的存储目录文章目录大小端、%u、%d打印的规则、数据在内存中的存储数据在内存中的存储整形存储无符号整型、无符号整型的打印char类型的打印浮点型存储大小端模式判断机器大小端方法数据在内存中的存储整形存储一个变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型而决定的。像 int a = 20;int b = -10;这样的整形数据在内存中是如何存储的呢?我们先来了解以下的概念:原码、反码、补码计算机中的有符号数有三种表示方法,即原码、原创 2021-05-25 16:44:10 · 12843 阅读 · 15 评论 -
扫雷实现——可标雷可展开,强迫症患者福音
C语言——扫雷小游戏的实现想必大家以前无聊的时候都玩过扫雷游戏,小时候我不会玩这游戏,觉得这游戏也太乏味了,在一个单调的板子上点来点去有啥好玩的,直到自己动手实现这个游戏,才知道这个游戏的背后要付出多少时间…我简单地阐述下游戏规则,我们随机点开一个格子,如果有雷,则被炸死,如果无雷,则这个格子上会显示一个数字,这个数字代表着这个格子周围雷的个数。接下来我们开始实现这个游戏吧。因为这个游戏需要设计的函数很多,所以我们把工程分为了三个部分:头文件部分(用来声明函数)、函数实现部分、进入游戏部分。首先原创 2021-04-29 23:35:05 · 1285 阅读 · 11 评论 -
getchar()的使用方法——给scanf当爹又当妈
一、getchar()的基本用法getchar()函数的功能是从缓冲区中读取一个字符,注意,是一个字符。当缓冲区中没有字符可以读取时,getchar()就会等待我们输入一个字符,然后把它读走,相反,如果缓冲区中存在字符,getchar()就不等我们输入,直接读取缓冲区中的字符。与此对应的是putchar(),它能够向终端输出一个字符。例1如下图,当我们输入一个字符a时,getchar()从缓冲区中把它读取,之后,putchar()把getchar()读取的字符a输出。与scanf不同,getcha原创 2021-04-14 21:16:42 · 50204 阅读 · 25 评论 -
C语言中的转义字符 4.8
C中定义了一些字母前加"“来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。C语言中的转义字符如下图若想表示’这个字符,当用’’'时,前两个’会成为一个转义字符,从而不能达到想要表达的意思,再比如”,若用"""这种形式表示,前两个"也会连成一个转义字符从而违背原来的意思,欲完成表达,可以用/’,/"来表达原来的意思。上图中的转义字符不详细讲解,大致都与举例的用法一致。以下详细说明最后两个转义字符/ddd表示的是原创 2021-04-08 14:35:45 · 1246 阅读 · 1 评论