C语言
文章平均质量分 87
C开发知识
WongKyunban
这个作者很懒,什么都没留下…
展开
-
Mikefile文件的工作原理
我们写的C代码都要编译后才能运行,那么写出来的C代码怎么组织编译呢?因为有些代码可能要依赖其他的代码,编译的顺序就要有个先后。Makefile就像一张编译的清单,它可以将这些依赖关系表达清楚,让make编译工具按我们所想的去编译我们的源代码。所以Makefile就是一份告诉make编译工具如何编译我们源代码的文件。编写一份make编译工具能看得懂的Makefile文件,以下这些知识,是我们应该要掌握的。现在就开始吧。基本知识规则:是Makefile用来告知make如何编译的。通常,一条规则包括三部分:原创 2022-02-03 19:28:32 · 1599 阅读 · 0 评论 -
使用gdb调试C语言程序
1.编译:gcc xxx.c -o xxx2.生成可调试文件:gcc -g xxx.c -o xxx3.调试程序:gdb xxx4.执行程序:start :从程序第一步开始执行run:直接运行程序到结束或者断点处5.设置断点:break line(行数)或函数名或者条件表达式break 6:在第6行设置断点break Swap :在Swap函数入口设置断点break 6...原创 2020-05-03 13:45:37 · 2547 阅读 · 0 评论 -
C语言之函数
C语言是靠函数来实现模块化的。使用函数,就不用将所有功能都写在main函数里。程序的结构也清晰,易读,易维护。模块化设计1. 各个函数实现各自的功能。最后利用main函数来调用各种函数,从而实现各种功能。2. 一个源程序文件是由一个或者多个程序模块组成,每个模块负责一个功能。3. C程序总是从main函数开始执行的,main函数调用其他函数,系统调用main函数。4. 函数之间不可以嵌套...原创 2019-12-24 23:46:59 · 1920 阅读 · 0 评论 -
C语言之常量
原创 2019-12-24 15:24:46 · 1800 阅读 · 0 评论 -
C语言之三种基本结构
C语言程序的三种基本结构:顺序结构、选择结构(if语句)、循环结构(for、while、do-while)。顺序结构从第一条语句执行到最后一条语句,按顺序的执行。示例:#include <stdio.h>#include <math.h>int main(int argc,char* argv){ double x,y,sum; ...原创 2019-12-22 23:17:13 · 12642 阅读 · 0 评论 -
C语言之枚举类型
如果一个变量有几种可能的值,则可以定义为枚举类型,就是把各种存在的值一一的列举出来。枚举在C/C++/c#中,是一个被命名的整型常数的集合。它可以让数据更简洁,更易读。接下来我们举个例子,比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个整数定义一个别名:#define MON 1#define TUE 2#define WED 3#define THU ...原创 2019-12-21 10:31:58 · 2264 阅读 · 0 评论 -
C语言之共用体
C语言共用体,又叫联合体,使用关键字union定义。共用体使用同一存储单元存放不同类型的变量。定义共用体类型变量的形式 :union 共用体名{成员表列;} 变量表列;例如:定义共用体变量Union Person{Int age;Char sex;}zhangsan,lisi;Union Person{Int age;Char sex;};Union Person ...原创 2019-12-20 21:03:18 · 2778 阅读 · 1 评论 -
C语言的声明
C99标准定义了long long类型,在64位机上保证至少64位。一个全局变量或函数可以有多处“声明”,但**“定义”只允许出现一次**。定义是分配空间并赋初值的声明。最好的做法是在某个相关的.c 文件中定义,然后在头文件.h中进行外部声明,在需要使用的时候只要包含对应的头文件即可。定义变量的.c文件也应该包含该头文件,以便编译器检查定义和声明的一致性。此条规则,提供了高度的可移植性。永远不要...原创 2019-10-29 20:54:34 · 2024 阅读 · 0 评论 -
C语言——网络与套接字
互联网中大部分的底层网络代码都是用C语言写的。网络程序通常由两部分程序组成:服务器和客户端。服务器将同时与多个客户端通信。客户端与服务器之间将展开一段结构化对话,叫做协议。互联网使用了各种协议,一部分是低层协议,另一部分是高层协议。低层协议有IP,它用来控制二进制的0和1在互联网中的发送方式。高层协议有HTTP,它用来控制浏览器与网络服务器的对话。协议通常有一套严格的规则。客户端和服务器...原创 2019-02-20 19:38:25 · 1889 阅读 · 2 评论 -
C语言——网络客户端
在上一篇文章C语言——网络与套接字介绍了网络服务器的相关知识。现在我们来看看网络客户端的相关知识。我们来写一个HTTP协议的网络客户端。说到HTTP协议,其实就像我们在C语言——网络与套接字自定义的IAHP协议一样。**协议是一段结构化对话。**网络客户端和服务器必须按照结构化的对话来进行通信。打开telnet看看是如何下载网页的。~$ telnet www.csua.berkeley.ed...原创 2019-02-21 12:34:04 · 1377 阅读 · 0 评论 -
gcc编译程序的过程
我们通过编译一个程序test.c,代码如下,来了解编译程序的过程。#include <stdio.h>int main(){ printf("Hello world!"); return 0;}1.预处理(Preprocessing)~/Desktop/test$ gcc -E test.c -o test.i~/Desktop/tes...原创 2019-03-12 18:18:29 · 1416 阅读 · 0 评论 -
国内比较好的OJ平台
Online Judge系统(简称OJ)是一个在线的判题系统。用户可以在线提交程序源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。北京大学POJhttp://poj.org/中国最受欢迎OJ之一,各式各样各种难度的题目都有。杭州电子科技大学HDUOJhttp://acm.hdu.edu.cn/中国最受欢迎OJ之一,题目数量多,来源广。UVAht...原创 2019-04-07 16:59:06 · 40810 阅读 · 4 评论 -
C语言中如何获取时间
C语言的时间函数,使用这些函数时要加入头文件time.h函数说明char *asctime(const struct tm *tm)将时间日期以字符串格式表示char *asctime_r(const struct tm *tm,char *buf)将时间日期以字符串格式表示,加了缓冲器存放返回值char *ctime(const time_t *timep)...原创 2019-04-02 19:41:39 · 3499 阅读 · 1 评论 -
OJ术语表: AC、WA、TLE、OLE、MLE、RE、PE、CE
在OJ(Online Judge)系统上刷题,你不能不知道下面这些术语:缩写英文解释中文解释OJOnline Judge在线判题系统ACAccepted通过WAWrong Answer错误答案TLETime Limit Exceed超时OLEOutput Limit Exceed超过输出限制MLEMemory Limit ...原创 2019-04-09 09:58:39 · 5183 阅读 · 0 评论 -
求最小数和最大数
C代码如下。第一种:#include <stdio.h>#include <limits.h>int main(){ int min = INT_MAX; int max = INT_MIN; int n,temp; while(~scanf("%d",&n)){ ...原创 2019-04-09 10:59:14 · 2286 阅读 · 0 评论 -
C语言用于存储空间动态分配的函数
Linux操作系统提供 了三个用于存储空间(进程的堆空间)动态分配的函数和一个用于释放内存空间的函数。malloc函数:给进程分配指定字节数的存储区,此存储中的初始值不为0,因此申请后要记得初始化一下。calloc函数:有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小,该空间的每一位都将被初始化为0。realloc函数:用于更改以前分配 区的长度(可...原创 2019-04-03 14:44:47 · 2014 阅读 · 0 评论 -
fread读文件操作
在Linux中,使用fread读取文件内容:#include <stdio.h>#include <stdlib.h>int main(){ FILE *fp; fp = fopen("hello.txt","rt"); //求得文件的大小 fseek(fp,0,SEEK_END); int siz...原创 2019-04-03 17:51:18 · 11281 阅读 · 0 评论 -
Makefile:*** missing separator. Stop.如何解决
在Makefile文件里要正确使用TAB,只有命令所在的行的开头能使用TAB键进行缩进。也就是说,如果行首需要缩进,那么应该使用TAB键,而不是空格,否则就会报以上错误。...原创 2019-10-07 20:12:05 · 2663 阅读 · 0 评论 -
C语言——getopt函数
#include &amp;amp;amp;lt;unistd.h&amp;amp;amp;gt;int getopt(int argc, char * const argv[],const char *optstring);getopt()函数解析命令行参数。它的参数argc和argv是命令行中传给main()函数的参数的个数和参数数组。参数数组中以’-'开头的元素是选项元素,“-“后面跟的就是选项字符。如果 getopt()被重复...原创 2019-02-25 15:48:41 · 3157 阅读 · 0 评论 -
C语言-结构体
假如有一个函数需要学生的信息:姓名、年龄、身高、体重、爱好、特长、学校名称:void info(const char* name,int age,int height,int weight,const char *hobby,const char* good,const char* school){}那么,你每次调用这个函数时就要传7个参数,真是又长又臭啊!有没有办法将这些参数打包起来呢?...原创 2019-02-14 15:24:35 · 641 阅读 · 0 评论 -
用make工具自动化构建
让我们从一个例子来大概介绍make工具:有个加密工具:encrypt.hvoid encrypt(char *message);encrypt.c#include "encrypt.h"void encrypt(char *message){ while(*message){ *message = *message ^ 31; ...原创 2019-02-13 23:19:31 · 955 阅读 · 0 评论 -
C程序的内存空间分配
可执行程序包括BSS段、数据段、代码段。在类UNIX系统下可使用size命令查看可执行文件的段大小信息。如size a.out:~/Desktop/MyC$ size a.out text data bss dec hex filename 1672 600 8 2280 8e8 a.out1.数据段存放已初始化的...原创 2019-02-15 19:25:12 · 3225 阅读 · 0 评论 -
C语言中平行的世界——线程
假如你的程序一边从网络读取数据,一边向网络发送数据。如何在代码中同时执行几个不同的任务?根据前面的知识,我们知道可以通过创建多几个子进程来做这些事。但是创建进程很花时间,而且不同子进程之间共享数据很不方便。这时我们需要线程来帮我们解决这个问题。如何创建线程呢?我们有很多线程库可以用,其中最流行的就是POSIX线程库,也叫pthread 。可以在类Unix系统上使用。假设我想在独立的线程中运行...原创 2019-02-21 19:25:15 · 812 阅读 · 0 评论 -
让函数能缩能伸--可变参数函数
我们来假设一种情景:有一个点餐的函数,它接收菜品名作为参数,当客人点一个菜时就传递一个参数,但是客人点的数量都不一样,有的多有的少,显然固定的参数个数是无法适应这种变化的。那该怎么办呢?如果大家对printf()函数还有印象的话,那么就知道它接收参数的数量是可变的。它是如何做到的呢?其实它要用到可变数量参数。参数数量可变的函数,我们称其为可变参数函数。C标准库中有一组宏可以帮助我们创建可变参数函...原创 2019-02-16 13:03:43 · 604 阅读 · 0 评论 -
C语言——条件编译和static关键字
条件编译#include &lt;stdio.h&gt;#ifdef HELLO char *c = "hello world";//如果HELLO这个宏存在,包含这段代码#else char *c = "No zuo,no die"; //否则包这段代码#endifint main(){ printf("%s\n",c);原创 2019-02-22 00:39:05 · 1252 阅读 · 0 评论 -
C语言——相关学习资源网站及工具
1.AllegroAllegro是一个跨平台库。它致力于视频游戏和多媒体编程方面。它可以处理常见的,低层级的任务,如创建窗口、接受用户输入、加载数据 、画图、播放音频等等。提醒:Allegro 不是游戏引擎。2.gdbGDB 是GNU项目使用的调试器。当运行gdb时,它可以让你知道另外一个程序里面正在发生什么事情或者在它崩溃时,它内部具体发生了什么。GDB主要做四件事,帮助你找到bug:...原创 2019-02-22 11:43:07 · 3169 阅读 · 0 评论 -
如何电脑上共享代码
如果你在同一台计算机上做编程工作,你想在多个程序中使用相同的代码,但又不想每个程序都保留一份相同的代码。那么最好的做法就是共享这部分代码,我们可以在程序之间共享两类代码:.h头文件和.o目标文件。那么应该怎么共享呢?共享.h头文件有两种方式:1.把.h头文件保存在标准目录中,在类Unix系统中,标准目录就是/usr/local/include只要头文件在标准目录中,就可以用尖括号包含它们...原创 2019-02-17 02:01:28 · 824 阅读 · 0 评论 -
进程与系统调用——fork、exec
C程序无论做什么事都要靠操作系统。例如它想与硬件打交道,就要进行系统调用。系统调用是调用操作系统内核中的函数,C标准库中大部分代码都依赖于它们。例如调用printf()函数在命令行显示出字符串时,C程序都会在背后向操作系统发出系统调用,把字符串发送屏幕显示。例如system函数:#include &amp;amp;amp;amp;lt;stdlib.h&amp;amp;amp;amp;gt;int main(){ system(&原创 2019-02-17 16:05:22 · 2273 阅读 · 0 评论 -
进程间通信——重定向、描述符表
进原创 2019-02-18 11:38:56 · 910 阅读 · 0 评论 -
如何快速找到C库函数的头文件
在终端使用man,如我想知道fileno()函数所在的头文件:~/Desktop/MyC$ man filenoFERROR(3) Linux Programmer's Manual FERROR(3)NAME clearerr, feof, ferror, fileno - check and reset ...原创 2019-02-18 11:48:55 · 2037 阅读 · 0 评论 -
C语言——open和fopen的区别
FILE *fopen( const char *filename, const char *mode );通过文件名打开文件,返回一个关联到该文件的文件流。mode模式是决定文件的访问模式。可以用fprintf向文件流写入格式化数据:int fprintf( FILE *stream, const char *format, ... );fopen打开的文件流用fclose关闭:i...原创 2019-02-23 13:17:08 · 6043 阅读 · 0 评论 -
创建自己的文件数据流
程序运行时,操作系统会为它创建三条数据流:标准输入、标准输出、标准错误。有时,我们也需要创建自己的数据流。fopen()我们可以用fopen()函数创建新数据流,每条数据流用一个指向文件的指针来表示:FILE *my_file = fopen("log.txt","w");fopen的第二个参数是模式:r:读w:写a:追加fprintf()可以用fprintf()往数据流中打印...原创 2019-02-18 12:16:20 · 964 阅读 · 0 评论 -
让进程等待--waitpid()函数
有些时候,进程之间需要协助才能完成一些任务,比如说,进程A和进程B共同完成一项任务,但是必须进程A先完成,然后进程B再开始,等进程B也完成了,任务也就完成了。先给出一个有问题的实例,然后我们来分析并解决它:aa.c//父进程#include &lt;stdio.h&gt;#include &lt;unistd.h&gt;#include &lt;string.h&gt;#includ.原创 2019-02-18 15:27:53 · 1033 阅读 · 0 评论 -
如何创建管道——pipe
我们有一个这样的场景:主程序希望与子程序进行通信。我们用pipe()函数为他们创建管道,这样他们就可以通过管道来通信了。为了演示方便我们只考虑:子程序把数据发送到父进程中来的情况。因此要用管道把子进程的标准输出和父进程的标准输入连接起来我们将用pipe()函数建立管道。每当我们打开数据流时,它都会加入描述符表。pipe()函数也是如此,它创建两条相连的数据流,并把它们加到描述符表中,然后只要...原创 2019-02-18 17:49:45 · 7250 阅读 · 0 评论 -
C语言——创建文件
创建文件#include <stdio.h>int main(int argc,char *argv[]){f(argc != 2){ printf("param error"); return 1; }else{ FILE *fd = fopen(*(argv+1),"w+"); if(fd != NULL){ printf("...原创 2019-02-23 21:44:29 · 21105 阅读 · 4 评论 -
C语言中的.h头文件的作用
首先C语言是一门面向过程的编程语言,它是由一系列的函数组成的。函数的使用必须遵守:先声明后使用的原则举个例子说明一下,下面是一个test.c的源程序:#include <stdio.h>int main(){ sayHello(); return 0;}void sayHello(){ printf("Tom says:%s...原创 2019-02-13 17:37:18 · 12100 阅读 · 4 评论 -
操作系统用信号控制程序
进程之死在linux的终端正在运行的程序,用户按了ctrl-C,程序就停止运行了。为什么ctrl-C可以彻底杀死程序?当操作系统从键盘读取数据,发现用户按了ctrl-C,就会向程序发送中断信号。信号是一条短消息,即一个整型值。当信号到来时,进程必须停止手中一切工作去处理信号。进程会查看信号映射表,表中每个信号都对应一个信号处理器函数。中断信号的默认信号处理器会调用exit()函数。信号映射表...原创 2019-02-19 11:50:48 · 1058 阅读 · 0 评论 -
编译器怎么把多个源文件编译成一个程序
预处理:修改代码。用#include指令添加相关的头文件,编译器可能还需要根据实际情况跳过程序中的某些代码或补充一些代码,可以用#define和#ifdef来实现。编译:转换成汇编代码。计算机只能理解更低层的机器代码指令。而生成机器代码的第一步就是把C语言源代码转化为汇编语言代码。汇编:生成目标代码。编译器把这些汇编代码(都是些符号代码)汇编成机器代码或目标代码,即CPU内部电路执行的二进制...原创 2019-02-13 18:09:13 · 3083 阅读 · 0 评论 -
C语言的高级东东——联合体、枚举、位字段
联合体,再写一篇,字对齐方式原创 2019-02-15 15:40:23 · 603 阅读 · 0 评论