
c语言
文章平均质量分 58
c语言实战
怪我冷i
这个作者很懒,什么都没留下…
展开
-
c语言指针加减法
为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小。,走了4步(这里十进制里的4步哦)。因为int类型为4字节。注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。其实是走了16步(这里十进制里的16步哦)。我们打印一下内存地址。,意思就是16进一,所以。下面代码会输出什么()选项有1,2,3,4。原创 2022-11-06 18:33:02 · 1090 阅读 · 0 评论 -
C语言实现OOP——轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍(三)
文章目录C 语言编程框架 LW_OOPC 介绍(三)方案的可扩展性如何?LW_OOPC最佳实践LW_OOPC的优点:LW_OOPC的缺点:总结:幕后花絮:参考资料:C 语言编程框架 LW_OOPC 介绍(三)方案的可扩展性如何?假设我们希望添加一种Ternary_node类型来表示三元操作符,如?:(也就是if-then-else操作符),看看,难度有多大? 事实上,正是因为前面的设计是面向对象的,要增加一种节点类型易如反掌:// 三元表达式节点CLASS(Ternary_node){原创 2021-05-16 17:55:35 · 1123 阅读 · 2 评论 -
C语言实现OOP——轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍(二)
轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍下面,再举一个稍微复杂的例子,它的覆盖面是足够全面的,足以一瞥面向对象编程的3个要素:数据抽象、继承和多态。通过这个例子,我们期望展现出LW_OOPC在遭遇问题本身比较复杂的情形下,是如何从容应对的,以加深读者对LW_OOPC的认识。(备注:该问题来自《C++沉思录》第八章的例子,有兴趣的读者可以对照参阅)问题描述: 此程序涉及的内容是用来表示算术表达式的树。例如,表达式(-5)*(3+4)对应的树为: 一个表达式树包括代表常原创 2021-05-16 17:45:12 · 513 阅读 · 2 评论 -
C语言实现OOP——轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍(一)
轻量级的面向对象 C 语言编程框架 LW_OOPC 介绍摘要:本文介绍一种轻量级的面向对象的C语言编程框架:LW_OOPC。LW_OOPC是Light-Weight Object-Oriented Programming in(with) C的缩写,总共一个.h文件,20个宏,约130行代码,非常的轻量级,但却很好的支持了很多面向对象的特性,比如继承、多态,可以优美的实现面向接口编程。为什么要用面向对象?面向过程方式开发的系统,代码复杂,耦合性强,难以维护,随着我们所要解决的问题越来越复杂,代码原创 2021-05-16 16:54:41 · 1218 阅读 · 0 评论 -
leetcode.2. 两数相加
leetcode.2. 两数相加两数相加#include <vector>#include <iostream>#include <unordered_map>using namespace std;/** * 单链表的定义 * Definition for singly-linked list. */struct ListNode { int val; ListNode* next; ListNode() : val(0)原创 2021-05-12 15:32:25 · 154 阅读 · 0 评论 -
Linux系统编程——pipe管道练习_父子进程完成ps_aux_grep_bash
父子进程完成ps_aux_grep_bash用管道完成,执行ps aux | grep bash命令,简单的说就是ps aux本来是输出到标准输出的,现在用dup2重定向到管道的写端,所以grep bash获取前方传来的数据,其标准输入得生重定向到管道的读端。原理1 创建管道2 创建子进程fork3 在父进程中关闭读端fd[0]4 在子进程中关闭写端fd[1]5 在父进程中将标准输出重定向到管道的写端6 在子进程中将标准输入重写向到管道的读端7 在父进程中调用execl函数执行ps au原创 2021-04-02 17:09:51 · 332 阅读 · 0 评论 -
Linux系统编程——孤儿进程与僵尸进程
文章目录孤儿进程孤儿进程的概念模拟孤儿进程的案例僵尸进程僵尸进程的概念如何解决僵尸进程模拟僵尸进程的案例参考孤儿进程孤儿进程的概念若子进程的父进程已经死掉,而子进程还存活着,这个进程就成了孤儿进程。为了保证每个进程都有一个父进程,孤儿进程会被init进程领养,init进程成为了孤儿进程的养父进程,当孤儿进程退出之后,由init进程完成对孤儿进程的回收。模拟孤儿进程的案例编写模拟孤儿进程的代码讲解孤儿进程,验证孤儿进程的父进程是否由原来的父进程变成了init进程。僵尸进程僵尸进程的概念若原创 2021-04-02 10:20:09 · 190 阅读 · 0 评论 -
Linux系统编程——dup2函数复制文件描述符
dup2dup2函数Ø 函数描述: 复制文件描述符Ø 函数原型: int dup2(int oldfd, int newfd);Ø 函数参数:oldfd-原来的文件描述符newfd-复制成的新的文件描述符Ø 函数返回值:成功: 将oldfd复制给newfd, 两个文件描述符指向同一个文件失败: 返回-1, 设置errno值Ø 假设newfd已经指向了一个文件,首先close原来打开的文件,然后newfd指向oldfd指向的文件.若newfd没有被占用,newfd原创 2021-03-31 14:29:09 · 204 阅读 · 0 评论 -
Linux系统编程——dup函数
dup函数dup函数Ø 函数描述: 复制文件描述符Ø 函数原型: int dup(int oldfd);Ø 函数参数: oldfd -要复制的文件描述符Ø 函数返回值:成功: 返回最小且没被占用的文件描述符失败: 返回-1, 设置errno值练习: 编写程序, 测试dup函数.测试dup函数复制文件描述符//测试dup函数复制文件描述符#include <stdio.h>#include <stdlib.h>#include <string原创 2021-03-31 14:28:05 · 503 阅读 · 0 评论 -
c语言反转字符串输出
c语言反转字符串输出c语言反转字符串输出,说难不难,说易不易!#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>char* rev_str(char *from,int len){ //判断字符串是否存在 if (from ==NULL ) { printf("func copy_str21() err\n"); return N原创 2021-03-10 16:29:20 · 3116 阅读 · 0 评论 -
c++安全传输平台——老师结构体编码与解码(ASN.1编码解码)
安全传输平台之老师结构体编码与解码老师结构体编码与解码demo1#define _CRT_SECURE_NO_WARNINGS#include "stdio.h"#include "stdlib.h"#include "string.h"#include "itcast_asn1_der.h"#include "itcastderlog.h"typedef struct _Teacher{ char name[64]; int age; char *p; int plen;原创 2021-02-22 22:21:50 · 1471 阅读 · 1 评论 -
c++从入门到精通——指向类成员的指针
指向类成员的指针指向成员变量的指针#include <iostream>#include <string>using namespace std;class A{public: A(int param){ mParam = param; }public: int mParam;};void test(){ A a1(100); A* a2 = new A(200); int* p1 = &a1.mParam; int A::*p2 =原创 2020-09-19 10:07:27 · 135 阅读 · 0 评论 -
c++从入门到精通——虚函数表
目录多态的基本概念静态联编与动态联编虚函数表查看Animal的虚函数表查看cat的虚函数表多态的基本概念多态是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。多态性(polymorphism)提供接口与具体实现之间的另一层隔离,从而将”what”和”how”分离开来。多态性改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性,项目不仅在最初创建时期可以扩展,而且当项目在需要有新的功能时也能扩展。c++支持编译时多态(静态多态)和运行时多态(动态多态),运算符重载和函数重载就是编译时多原创 2020-09-18 19:30:23 · 170 阅读 · 0 评论 -
C语言——指针的加法
打印一下void test7() { int a[4] = { 1, 2, 3, 4 }; printf("a = %p\n\n", a); int* ptr = (int*)(&a + 1); printf("ptr = %p\n", ptr); printf("ptr+1 = %p\n", ptr+1); printf("ptr+2 = %p\n\n", ptr+2);原创 2020-09-07 22:42:31 · 3054 阅读 · 0 评论 -
c语言const关键字
文章目录const关键字Const修饰变量指针中的const使用1.指针是const情况2.所指的值是constConst数组实战例题解答参考const关键字转自——C语言中的const用法const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。Const修饰变量我们可以看到一旦被修饰就不能被赋值改变。指针中的const使用指针是一个变量 指针里面有两原创 2020-09-05 15:03:44 · 256 阅读 · 0 评论 -
多个main怎么编译
如果一个目录中有多个c文件都有main函数,如何编译。makefile编写如下# create by ww 20200809SrcFiles=$(wildcard *.c)TargetFiles=$(patsubst %.c,%,$(SrcFiles))all:$(TargetFiles)%:%.c gcc -o $@ $< -lpthread -gclean: -rm -f $(TargetFiles)执行make即可编译。...原创 2020-08-10 08:54:16 · 955 阅读 · 1 评论 -
c语言——直接插入排序实现(时间复杂度与空间复杂度分析)
c语言——直接插入排序插入排序就是将一个记录插入到已排好序的序列中,从而得到一个新的有序序列。那问题是我们要排序的是一个数组,哪里来一个排好序的序列呢?这时,我们可以把数组下标为0的元素想像成一个有序的数组,后面的元素和他比较。以升序为例升序//升序void InsertSort(int arr[],int len){ for (int i = 1; i < len; ++i) { if (arr[i] < arr[i - 1]) { int temp =原创 2020-05-27 23:05:08 · 9416 阅读 · 0 评论 -
c语言——链表队列的实现
c语言——链表队列的实现头文件#pragma once#include<stdlib.h>//链表结点的数据类型struct QueueNode{ struct QueueNode *next;};//链表数据类型struct LQueue{ struct QueueNode header; //头结点 int size; struct QueueNode *rear; //尾指针,始终指向链表的最后一个节点};typedef void* LinkQueu原创 2020-05-27 16:39:50 · 268 阅读 · 0 评论 -
c语言——栈的应用(应近匹配)
c语言——栈的应用(应近匹配)几乎所有的编译器都具有检测括号是否匹配的能力那么如何实现编译器中的符号成对检测如下字符串5+5*(6)+9/3*1)-(1+3(路算法思从第一个字符开始扫描当遇见普通字符时忽略当遇见左符号时压入栈中当遇见右符号时从栈中弹出栈顶符号,并进行匹配匹配成功:继续读入下一个字符匹配失败:立即停止,并报错结束成功:所有字符扫描完毕,且栈为空代码头文件SeqStack.h#pragma once#include<stdlib.h>#inc原创 2020-05-27 16:09:09 · 262 阅读 · 0 评论 -
c语言——栈(链表实现)
c语言——栈(链表实现)栈的链式存储链表部分头文件LinkList.h#pragma once#include<stdlib.h>#include<string.h>#include<stdio.h>#ifdef __cplusplusextern "C"{#endif typedef void * LinkList; typedef void(*FOREACH)(void *); typedef int(*COMPARE)(void *,原创 2020-05-27 15:37:09 · 258 阅读 · 0 评论 -
c语言——栈(受限制线性表)
c语言——栈(受限制线性表)概念首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是种特殊的线性表而已。定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。特性它的特殊之处在于限制了这个线性表的插入和删除的位置,它始终只在栈顶进行。这也就使得:栊廝是定的,最先进栊的只能在栈廊。操作栈的插入操作,叫做进栈,也成压栈。类似子弹入弹夹栈的删除操作,叫做出栈,也有的叫做弹栈,退栈。如同弹夹中的子弹出夹代码用数组实现栈SeqStack.h#p原创 2020-05-27 15:17:34 · 500 阅读 · 1 评论 -
c语言——单向链表II
c语言——单向链表II参考c语言——单向链表I,但是这里少了内存管理代码代码写在一个文件#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>//链表节点数据结构struct LinkNode{ struct LinkNode *next;};//链表结构体struct LList{ struct LinkNode h原创 2020-05-27 15:02:25 · 215 阅读 · 0 评论 -
c语言——单向链表
c语言——单向链表头文件LinkList.h#pragma once#include<stdlib.h>#include<string.h>#include<stdio.h>#ifdef __cplusplusextern "C"{#endif typedef void * LinkList; typedef void(*FOREACH)(void *); typedef int(*COMPARE)(void *,void *); //初始原创 2020-05-27 14:43:26 · 195 阅读 · 0 评论 -
c语言——动态数组(线性表)
目录c语言——动态数组DynamicArray.h头文件DynamicArray.c动态数组测试c语言——动态数组DynamicArray.h头文件#pragma once#include<stdlib.h>#include<stdio.h>#include<string.h>#ifdef __cplusplusextern "C"{#endif //1. 先把所需要的数据信息结构定义下来 struct DynamicArray { //原创 2020-05-25 19:14:14 · 454 阅读 · 0 评论 -
c语言——选择排序(回调函数)
回调函数函数指针作为某个函数的参数函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。简单讲:回调函数是由别人的函数执行时调用你实现的函数。以下是来自知乎作者常溪玲的解说:你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你原创 2020-05-21 21:41:28 · 808 阅读 · 0 评论 -
c语言——静态链表和动态链表
c语言——静态链表链表结点类型定义如何遍历链表#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>//链表结点类型定义struct LinkNode{ int data; struct LinkNode *next;};void test(){ struct LinkNode node1 = { 10, NULL };原创 2020-05-21 20:50:56 · 328 阅读 · 0 评论 -
c语言——配置文件读写
目录c语言——配置文件读写代码头文件主文件工具类判断当前行是否有效获得文件有效行数加载配置文件解析配置文件获得指定配置信息释放配置文件信息总的代码c语言——配置文件读写配置文件读写文件的读取与关闭在c++中调用c语言函数二级指针作函数参数三级指针作函数参数二级指针赋值给三级指针结构体二级指针代码头文件ConfigFile.h#define _CRT_SECURE_NO_WARNINGS//防止头文件重复包含#pragma once#include<stdio.h&g原创 2020-05-19 18:11:11 · 7505 阅读 · 1 评论 -
c语言——结构体偏移
目录c语言——结构体偏移整数类型浮点类型例子结构体成员偏移量test01test02test03参考资料c语言——结构体偏移学习结构体偏移前,我们先复习一下c语言的数据类型整数类型下表列出了关于标准整数类型的存储大小和值范围的细节:类型存储大小值范围char1 字节-128 到 127 或 0 到 255unsigned char1 字节0 到 255signed char1 字节-128 到 127int2 或 4 字节-32,768 到原创 2020-05-18 17:26:59 · 4385 阅读 · 0 评论 -
c语言——结构体嵌套二级指针
c语言——结构体嵌套二级指针如果一个结构体内嵌套二级指针了二级指针,这里的students为二级指针,也对应了一对多的关系,一个老师,多个学生。struct Teacher{ char *name; char **students;};我们知道,二级指针指向一级指针的地址,三级指针指向二级指针的地址void test(){ struct Teacher **teachers = NULL; int ret = 0; ret = allocateSpace(&teach原创 2020-05-18 16:18:11 · 1614 阅读 · 0 评论 -
c语言——结构体嵌套一级指针
c语言——结构体嵌套一级指针这里用支了二级指针 struct Person **person = NULL; person = allocateSpace();//分配内存 printPerson(person);//打印Person数组 freeSpace(person);//释放内存 person = NULL;//置空,防止野指针运行Name:Name_1 Age:100Name:Name_2 Age:101Name:Name_3 Age:102Name:Name_1的内存被释原创 2020-05-18 15:34:17 · 376 阅读 · 0 评论 -
c语言——结构体赋值(深拷贝和浅拷贝)
c语言——结构体赋值结构体赋值1struct Person{ char name[64]; int age;};void test01(){ struct Person person1 = { "aaa", 20 }; struct Person person2 = { "bbb", 30 }; //赋值操作 person1 = person2; printf("Name:%s Age:%d\n",person1.name,person1.age); printf("N原创 2020-05-18 15:23:39 · 6853 阅读 · 0 评论 -
c语言——结构体基础概念
c语言——结构体基础概念对结构体变量可以在定义时指定初始值struct Person{ char name[64]; int age;}person = { "John", 100 };void test01(){ //strcpy(person.name, "Lily"); //person.age = 100; printf("Name:%s Age:%d\n", person.name, person.age); struct Person p;}运行Name:J原创 2020-05-18 15:19:19 · 336 阅读 · 0 评论 -
c语言——指针数组_选择排序
c语言——指针数组_选择排序所谓选择排序,就是每次找到未排序中最小的(最大的也行)元素的位置,找到后与该位置与未排序序列的第一个元素交换值,直到该序列成为有序序列。初始状态整个序列为无序序列,每次交换都使有序序列的长度加一,无序序列的起始位置后移一位。选择排序的平均时间复杂度为O(n^2),且选择排序相对不稳定。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdl原创 2020-05-18 15:10:44 · 3352 阅读 · 0 评论 -
c语言——查找子串
c语言——查找子串int del_substr(char *str, const char *substr);函数首先判断 substr是否出现在str中,如果并未出现,函数就返回0如果出现,函数应该把str中该字符串后面的所有字符串赋值到该字符串位置从而删除这个字符串,然后函数返回1。如果 substr多次出现在str中,函数只删除第1次出现的字符串a.函数中不使用任何操作字符串的函数.(如: strcpy、 strcmp等)b.函数中的任何地方不使用下标。原理利用双指针比较。例原创 2020-05-16 00:49:32 · 8073 阅读 · 0 评论 -
C语言错误: HEAP CORRUPTION DETECTED
C语言错误: HEAP CORRUPTION DETECTED#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#define WORDMAX 3struct dictsb{ char * word; char * trans;};typedef struct dictsb dic;int main(){ //开辟堆空间原创 2020-05-12 19:03:18 · 603 阅读 · 0 评论 -
Qt Creator 5.14版下载及安装——MSVC
Qt Creator下载及安装Qt是C++的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率。Qt Creator是一个IDE,就是一个平台,一个开发环境,类似的比如说VS,也可以进行Qt开发,当然VS中的Qt是作为一个插件插入VS平台的。下载地址 Parent Directory - submodules/ 31-Mar-2020 09:27 - single/ 31-Mar-2020 10:10 - qt-opensource-windows-x86-5.14.原创 2020-05-11 19:27:51 · 9014 阅读 · 0 评论 -
c语言——大文件拷贝
c语言——大文件拷贝按【字符】读取复制本文代码在deepin(Linux系统)下编译与测试#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include<sys/types.h>#include <sys/stat.h>//10M大小#define MAXSIZE 1024*1024*10// 有点问题,会多一原创 2020-05-11 00:38:01 · 1234 阅读 · 0 评论 -
四则运算——c语言
文章目录四则运算——c语言题目生成读取计算C 库函数 - fputc()描述声明参数返回值实例C 库函数 - sprintf()描述声明参数返回值实例资料四则运算——c语言题目有个文件大小不确定,每行内容都是一个四则运算表达式,还没有算出结果,写一个程序,自动算出其结果后修改文件。生成设置随机数种,生成随机数。练习使用fputc函数。#include<stdio.h>#include<string.h>#include<stdlib.h>#inclu原创 2020-05-10 13:37:04 · 12247 阅读 · 0 评论 -
c语言——vi编辑器
c语言——vi编辑器(第一版)#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>//muvi abc.txtint main(int argc ,char * argv[]){ char fileName[256]; printf("请您输入一个需要创建的文件:\n"); scanf("%s", fileName); getchar原创 2020-05-10 11:52:15 · 711 阅读 · 0 评论 -
判断回文数
题目palindrome-number判断一个数是否为回文数。设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数代码#include <stdio.h> int main(){ int n, reversedInteger = 0, remain...原创 2019-11-19 19:55:52 · 1234 阅读 · 0 评论