自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 C语言基本加密解密

基本加密解密对于位运算来说,由于两次异或运算可以将值还原这个特性,所以经常使用异或进行加密解密运算,如下:0 ^ 0 = 0 0 ^ 0 = 01 ^ 0 = 1 1 ^ 0 = 10 ^ 1 = 1 1 ^ 1 = 01 ^ 1 = 0 0 ^ 1 = 1根据上面结果无论两个char还是两个int或者别的类型,甚至两个不同类型、不同长度的数据两次异或后都可以还原,这就为加密解密提供了理论保障。密码可以是一个数值,只要将需要加密的内容的每个字节与这个数值异或即可,但采用字符串作为密码更

2022-04-16 23:04:23 7144 2

原创 C语言排序

排序排序也是程序日常需要做的工作之一,排序的算法有很多,比如冒泡、选择、快速、堆等算法,针对不同情况可以选择不同的算法,但为了提升编码效率,库函数提供一种通用高效排序方法,我们只需提供比较条件就可以直接调用,这样就大大降低了排序的难度。C语言提供了qsort(),从名称上可以看出它是快速排序法,对较大型的数组而言,快速排序是最有效的排序算法之,该算法由C.A.R.Hoare于1962年开发,它把数组不断分成更小的数组,直到变成单元素数组。首先,把数组分成两部分,一部分的值都小于另一部分的值,这个过程一直持

2022-04-14 21:54:51 511

原创 C语言生成随机数

生成随机数在我们生活的世界中,只有物理装置的随机数发生器才能生成真实的随机数,或者你也可以通过丢骰子来创建它,但通过计算机创建随机数非常困难,计算机程序如同数学公式般的死板,这也是它的特长。想通过计算机生成随机数有两种方式,一种是加入人为操作,例如随意晃动鼠标,然后使用这些坐标生成随机数,但不是每个程序都是互动型的。另外一种是生成伪随机数,它不需要互动,其原理是根据BIOS时钟生成一个种子数,然后通过固定的公式算出均匀分布的值。C标准随机数stdlib库提供的rand()函数根据种子数按照正态分布函数

2022-04-12 11:09:37 2629 1

原创 C语言数学函数库

数学函数库几乎所有语言都会提供数学函数库,数学函数库起码包含幂,对数、三角函数等最基本的运算,C对于基本数学函数还算全面,如下表:使用数学函数库需要导入math.h,表中所有参数和返回值都是double,对于float, long double类型有对应的函数sqrtf()和sqrtl(),不同编译器提供的类型可能不同。这里要说的是为什么反正切有两个函数atan()和atan2(),当我们通过坐标求夹角时,可以使用反正切函数atan(y/x)求得,如图:但是atan()的值域为(-π/2, π/2)

2022-04-11 09:28:46 10690

原创 C语言错误和断言

错误和断言在预编译时我们学过使用#error让编译器报错的方法,C标准还有一个让程序运行时报错的机制,那就是断言函数assert(),这个函数参数是一个表达式,如果表达式不为0则继续执行,为0则报错,如下:#include <stdio.h>#include<assert.h>int main(){ int x = 0, y = 0; scanf("%d,%d", &x, &y); assert(y); printf("%f\n",(double)

2022-04-08 09:52:22 1639

原创 C语言可变参数

可变参数可变参数看起来好像只是高级语言的特性,其实C语言也有,这种能力来自于指针和编译器的支持。访问main()函数中的参数main()函数可以接受控制台命令传入的任意参数,它将参数放入一个指针数组中,在学习指针之前我们不知道如何访问这些参数,现在再来看就会觉得很简单。main()函数的格式为:int main(int argc, char *argv[]){ return 0;}其中argc是参数个数,*argv[]是指针数组,存放参数的字符串,现在获取命令行参数很简单了,例如:#in

2022-04-06 22:57:39 2446

原创 C语言玩转多进程

文章目录文章目录文章目录多进程退出程序析构函数暂停调用系统命令设置当前目录顺序执行命令并发执行命令进程标识进程PID进程句柄多进程总结多进程在一个项目中并发执行任务时多数情况下都会选择多线程,但有时候也会选择多进程,例如可以同时运行n个记事本编辑不同文本,由一个命令跳转到另外一个命令,或者使用不同进程进行协作。在学习多进程之前我们必须了解一个进程如何获取进程,进程如何结束,如何调用外部进程等操作。退出程序自ANSI C开始就支持退出程序和析构,无论在任何时候调用exit()都会直接退出程序,ex

2022-04-01 23:47:22 3574

原创 C语言开启多线程

文章目录文章目录文章目录多线程C语言中的多线程创建多线程阻塞和分离等待和退出线程标识和判断独占数据线程对象线程存储共享数据互斥条件互斥原子操作内存栅栏多线程总结多线程计算机发展初期为单核单任务,windows开始发展为单核多任务,而后是多核多任务,多任务开始为多进程,后来出现了多线程,多核为多进程和多线程提供了更好的支持,不仅可以分配时间线,还可以分配空闲的核心。进程是一个独立功能的程序,为了防止程序之间相互干扰,操作系统在内存中为进程之间筑了一道墙,这就导致进程之间切换和通信变得困难。线程是一个

2022-03-30 11:12:20 7958

原创 C语言数据流重定向

数据流重定向从前面章节中我们对标准输入输出和文件输入输出有了完整的概念,它们都操作数据流,只是输入输出的目标不同,这些函数都是同步函数,它们在底层调用系统io,执行完后再执行下面的代码。可以发现两者函数非常相近,因为两者在实现上有相通之处,实际上在标准输入输出的内部实现中大量调用了文件输入输出函数,标准流将FILE替换成stdio和stdout,并且自动处理缓存,文件尾,换行符等内容,使我们不会遇到指针错误。我们也可以将文件指针换成stdin和stdout来使用fprintf()等函数进行标准输入输出,但

2022-03-29 11:52:21 2118

原创 C语言非阻塞监听按键

使用scanf()和getchar()处理输入文字很合适,它会停止后续代码执行等待用户输入,直到按回车才继续执行,这种缓冲方式称为阻塞式监听,很多时候我们利用在代码末尾添加getchar()来防止程序马上退出以看到输出结果。但这种方式对于编写需要实时响应按键的程序简直是灾难,例如用键盘操作的游戏。我们需要一种随时获取键盘按下状态的非缓冲机制,这个机制称为非阻塞式监听。在windows中C库给我们准备了三个函数来干这件事情:kbhit() 查看按键缓冲区中是否有字符,有返回true,没有返回false,非阻

2022-03-28 19:02:08 3090

原创 C中的字面值与匿名

到目前为止我们只接触过一种字面值,那就是字符串,除了字符串C99还允许在C语言中使用字面值创建数组、结构体这样的数据集合,格式为:(类型){数据}对于数组int a[3]={1,2,3}来说,类型为int[3]或 int[],值为{1,2,3},因此字面值为(int[3]){1,2,3} 或(int[]){1,2,3},对于结构体:struct Point{ float x; float y;} p={3,5};p的类型为struct Point,值为{3,5},因此字面值为(struct

2022-03-25 21:25:45 1824

原创 C语言中的位操作

位操作C语言常用于底层开发,它可以与硬件通信并且可以嵌入汇编语言,因此经常需要进行位操作,例如一台IBM PC通过向端口发送指令来控制硬件,控制代码通过读取指令字节上某个位来打开设备,其它位可能储存发送的信息。这就需要提取位上的信息。进制日常生活中我们常常使用十进制,原因可能得益于我们有10个手指头和脚趾头,计算机则使用二进制,因为信号的打开和关闭只有两种状态,很容易实现。八进制常用于小型设备或者古老的计算机,现在已经很少使用,目前常用的是十六进制,因为十六进制用F对应二进制1111,FF对应1111

2022-03-25 21:17:46 5077

原创 C中的函数

函数C语言没有类,因此封装完全依赖函数,C语言自带的标准库、第三方库都是以函数方式提供的,C不会自动将函数定义提升,c标准要求在定义前使用必须先声明,这也是产生头文件的原因。主函数对于面向过程的C语言,程序的入口是main函数,不同的编辑器生成的main函数也不同,例如eclipse CDT为:int main(void){return EXIT_SUCCESS;}dev c++为:int main(int argc, char *argv[]){return 0;}eclipse

2022-03-01 13:58:20 278

原创 c中的语句

语句用于描述代码的逻辑,因为过去并没有bool类型,因此在if中只要表达式值不为0都表示真;swich语句中,case只能是整形或字符型,不能是字符串或地址。for语句不支持循环标签,只能退出一层循环,必须手动编写更多的代码跳出指定循环。C99标准允许在for循环中定义变量,例如:for(int i=0;i<10;i++) {int j=0;j++;}...

2022-03-01 13:17:36 70

原创 c中的字符串

c中的字符串C使用原始的字符数组储存字符串,字符串就是在字符数组结尾加上’\0’表示结束,这种原始的方式的优缺点和数组相同,优点是性能好且结构透明,缺点是编码效率低,且因为字符长度不等于数组长度,总要考虑结尾的’\0’,还要随时观察数组的长度进一步增加了复杂性。在C中声明一个字符串需要保证数组长度足够,例如:char c[20]=”Hello World”; //等效于char c[20]={“Hello World”};字符数组长度为20,字符串长度为11,实际使用12个元素,如果字符串今后不再修

2022-03-01 13:15:43 532

原创 C语言数组

数组C中的数组是原始数组,其长度固定,类型相同且在内存中连续存放,其定义和初始化的格式与其它语言大致相同,例如:int a[5]; 包含5个整形元素的数组,元素初始值未知int a[5]={1,2,3,4,5}; 创建长度位5的数组并将每个元素初始化。int a[]={1,2,3,4,5}; 通过初始化自动计算长度int a[10]={1,2,3}; 创建长度位10的数组,初始化一部分元素,剩余元素默认值为0当只初始化一部分元素时,其它元素会被设置为默认值,整数的值默认为0,浮点为0.0,字符

2022-03-01 11:16:03 378

原创 C语言变量和常量

基本数据类型的初始值跟编译器有很大关系,不是所有编译器int初始值都为0,因此除非你的代码不需要移植,并且对编译器非常了解,否则就应该手动进行初始化。下面再来看看常量,通过#define PI=3.14 定义别名和const int PI=3.14都可以定义常量,区别是#define是预编译替换指令,不在系统中创建变量名。用const定义的是一个不允许改变值的变量,显然使用const更加标准,而且含义更加清楚。如果定义基本数据类型的常量,则常量的值不允许修改,如果将struct定义为常量则既不能对结构体常

2022-03-01 10:55:27 212

原创 C语言基本数据类型之间的转换

在C中基本数据类型会自动进行转换,如果没有进行强制类型转换,有的编译器会给出警告,整数和浮点的转化前面已经讲过,字符会按照ascii码进行转换,其实在底层编译时编译器也会采取长度增加的方式进行自动转换。在表达式中涉及两种类型的运算时,int会自动转为long,单精度会自动转化为双精度,这是因为cpu只会计算类型相同的数据,将类型级别从小类型转为大类型称为升级。而当计算结果匹配给变量时,变量类型级别比结果低,例如双精度赋值给单精度会丢失精度,这个过程称为降级。当把’a’赋值给一个泛型时,会视作int。使用强

2022-03-01 10:39:48 353

原创 C语言基本数据类型的运算

很多高级语言和C语言处理除法的规则是一样的,当被除数和除数都是整数时结果为整数,截取小数部分;当被除数和除数里面有一个是小数时,结果为双精度浮点。通常C编译器在编译时不会检查除数为0的情况,需要我们自己判断,一旦除数为0会导致运行时程序崩溃。对于余数,使用符号%,余数可以是正数也可以是负数,规则是当左边是正数时,那么余数也是正数;左边是负数时余数也是负数,因此100%-12结果为4,-100%4结果为-4。...

2022-03-01 10:27:51 301

原创 C中的补充数据类型

在科学计算和工程计算中需要用到复数和虚数,C99标准支持复数和虚数但有所保留,C11把整个复数包都作为可选项。作为可选项使用复数需要导入complex.h,不同的编译器实现方式也不同,例如在gcc中单精度复数为float _Complex,而在VS中为_Fcomplex,具体使用方法参考本地complex.h库。在很多地方可以看到函数返回size_t这个类型,size_t并非一个新数据类型,它是为配套sizeof返回值给出的C标准。sizeof返回size_t类型,它描述数据长度,是一个正整数,实际类型为

2022-03-01 10:24:28 165

原创 C中的基本数据类型

新的C语言标准增加了long long和long double类型表示长整型和长浮点型,但C语言并未定义基本数据类型所占的字节数,而是交给编译器决定,大部分C编译器和高级语言对于基本数据类型的定义大致相同,记住基本数据的类型和范围是有必要的。类型 字节数 取值范围char 1 0-255short 2 -32767-32767unsigned short 2 0-65535int 4 -2147483648-2147483648unsigned 4 0-4294967295long 8 -92

2022-03-01 10:15:12 73

原创 关于C标准

C标准对编译C代码有很大的影响,目前的标准大概有ANSI/ISO C,C99, C11,C17等,ANSI/ISO C很古老,是上个世纪的标准,C99是改进的标准,它很好的被各个编译器普及,现代的编译器几乎都支持,C11,C17是新标准,增加了很多新特性,这些特性对于小型机不一定需要,因此编译器供应商并未普遍接受,或者选择性接受。大的编译器如virsual studio,gcc,clang等主要精力放在对C++标准的支持,对C11的支持并不完全,反而是一些专门针对C的小编译器如PellesC支持的更多,但是

2022-03-01 10:09:58 474

原创 C语言模块化开发,深入多文件编程

多文件编程如果只写一个小程序用于学习和测试,将所有代码写到一个源文件中无可厚非,一旦涉及到项目,几乎是不可能完成的事情,成千上万行的代码不仅难以阅读和维护,调试起来简直是自虐。我们需要将代码按功能分散到一个个小文件中并有序组织,每个小文件称为模块。使用模块开发项目是一个很大的课题,模块如何编写,编译器如何将模块合并成项目,模块如何重用以及如何避免模块之间的冲突都是要处理的问题,这其中还包含被编译器隐藏的底层工作,不同IDE构建项目的方式以及如何掌控编译的过程。万事开头难,我们还是从最简单的方式入手,然后采

2021-03-03 21:57:50 2477 2

原创 C语言内存管理

从设计原来上来讲,CPU自身是不存取数据的,指令和数据必须通过内存才能读入CPU,然后将计算结果返回到内存中,也就是说CPU只负责计算和处理指令,其内容和结果都保存在内存中,掌控了内存就控制了一切,能够与硬件直接对话的底层语言都是围绕内存工作的。虚拟内存在计算机发展初期,程序是直接运行在硬件之上的,这时cpu和内存完全由程序员管理,需要程序员自己处理各种边界条件和安全问题,此时程序所操作的内存是真实的,也是不安全的。直接在硬件上写程序,优点是代码透明,性能高,缺点是大部分精力都放在解决各种硬件问题,效率

2021-01-22 22:45:52 1970 5

原创 C语言中的别名

定义别名当我们用struct,enum定义变量时,关键字struct,enum不可省略,这使得代码显得臃肿,当用一个复杂指针多次定义变量时,不仅显得臃肿,还容易出错,为数据类型定义别名是一种有效的解决方案,C语言虽然可以通过宏来定义别名,但能力有限,虽然我们可以用#define定义一个基本数据类型的别名,例如:#define int IntegerInteger a=1;但是这种写法不能用于结构体和枚举,例如我们定义一个结构体Student:#define struct Student{int

2020-12-31 11:43:19 4432

原创 C中的预处理、泛型、内联以及宏

系列文章目录文章目录系列文章目录预处理使用#include导入文件使用#define定义宏简单的宏带参数的宏宏参数字符串化链接宏参数预定义宏条件编译使用#error阻止程序编译预处理预处理就是在编译代码之前对源代码进行重新组织、改写以达到我们预期编译的目的,我们在编写代码时需要用#include导入头文件,用#define定义宏来增强代码可读性,或者用#if,#else来解决不同平台的代码移植问题,这些预处理命令都是以#开头的,在编译代码之前,编译工具会自动调用预处理程序来执行这些预处理命令,它将修改

2020-12-29 22:41:03 539

原创 C语言中的复杂数据类型

目录文章目录目录复杂数据类型结构体结构体指针和成员的引用结构体数组构建链表共用体位域枚举复杂数据类型总结复杂数据类型对于任何一门能够处理实际应用的编程语言,基本数据类型都是不够用的,只能存放线性数据的数组也是不够用的,例如一个学生拥有姓名、性别、年龄等内容,这样的内容必须用复杂数据类型来描述,对于高级语言来说复杂数据类型可以用类描述,对于C这样的面向过程语言,C标准提供了结构体、共用体这样的复杂数据类型来描述。结构体结构体这种数据类型有很多称呼,有的称关联数组,有的称为构造型数组,在结构体中可以定

2020-12-26 20:51:53 1715

原创 C中的指针

指针指针是C语言的特色,为什么C语言会有指针?因为C语言是底层语言,底层语言时时刻刻不可避免的会与内存打交道,指针带来了操作内存的强大能力和编写代码的便利性,缺点是大大增加了代码的复杂性和阅读难度,且增大了bug出现的机率,从某些方面来说非常考验程序员的功底。所谓指针就是访问内存地址,一个内存单元为1字节,但是单元编号却很大,64位程序用8个字节编号,32位程序用4字节编号,4字节最大能表示4294967295,这就是为什么32位操作系统最大支持4G内存的原因。内存控制器通过地址编号来存取内存单元,变量名

2020-12-23 23:48:17 474

原创 C语言深入文件输入输出

文件输入输出掌握了标准输入输出后再学习文件的输入输出就简单多了,更重要的是之前我们除了能和控制台交互做不了更多的事情,文件的输入输出也是标准库包含的内容,也就是说和控制台交互和文件读写是C语言最基本的功能,任何平台都支持。仅凭这两个功能C已经可以做很多事了,windows和linux很多命令都是C写的,像mysql这样的数据库也是用C写的,一些压缩工具和编码工具也是用C写的,然后以命令行方式提供,它们都没有界面,仅用了标准库,但功能却非常强大。标准输入输出和文件的输入输出虽然作用不同,但思路是一样的,C将

2020-12-17 13:26:15 856

原创 C语言深入标准输入输出

标准输入输出你吃透了吗?了解标准输入输出printf()scanf()第一个问题第二个问题第三个问题第四个问题深入scanf()清缓存便捷的标准输入输出函数scanf()运用一scanf()运用二scanf()运用三scanf()运用四scanf()为何要如此?非阻塞监听按键输入密码了解标准输入输出所谓标准输入输出,我们先理解为通过控制台来输入和显示内容,只要是个操作系统都会有控制台,这是最基本的人机交互方式,后面会详细讲解标准输入输出的概念。标准输入输出是C语言初学者第一个要越过的门槛,特别是prin

2020-12-12 19:33:06 1570

原创 在C语言中使用中文,本地化全攻略

C语言本地化很多人认为C语言只支持ascii码,这是误解,你用printf(“这是中文”)同样可以输出中文,用fputs(“C语言本地化”)也可以向文件中写入中文。那么C语言默认使用什么编码呢?这与操作系统、所在区域、编译器有很大的关系,因为C标准并未规定使用什么编码。另外可能你会发现虽然可以输出中文字符串,但并不能用char c=’中’来声明一个中文字符,如果用strlen(“C语言”)来求字符串长度,给出的值为5,因此默认情况下C并不能很好的支持中文。如何让C语言很好的支持中文呢?这需要我们从基本编码

2020-11-19 10:18:53 6168 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除