一、准备工作
语言是基于UNIX开发的,所以使用c语言要在UNIX或linux(等类Unix的系统)上。但windows是不兼容UNIX的,所以要下个虚拟机来运行UNIX
下载Ubuntu镜像:http://www.ubuntu.org.cn
不同操作系统的虚拟机软件:
mac版:VMware Fusion
windows版:VMware Workstation
ubuntu 是个可以兼容linux的镜像系统
Vmware虚拟机和Linux系统的安装本章不做重点讲解,大家可以看我的Linux学习文章,或者关注微信号 “大嘴蜗牛”获取Linux知识干货。
1、linux常用指令
sudo(管理员权限)
sudo apt-get install + 软件名称 (安装程序)
sudo apt-get update (更新资源)
sudo apt-get install vim (安装VIM)
clear (清空屏幕)
cd + 目录 (进入目录)
cd ~ (进入根目录)
ls (查看当前目录包含的文件和文件夹)
ls -l (查看当前目录包含的文件或文件夹的详细信息)
touch + 文件名 (新建文件)
rm + 文件名 (删除文件)
mkdir + 目录名 (新建目录)
pwd (查看完整目录地址)
vi(vim) + 文件名 (使用VIM编辑文件)
VIM命令模式:
i (插入模式 或 当前光标前插入字符)
Esc (返回命令行模式)
:w (保存)
a (当前光标后插入字符)
:q (退出VIM)
Shitf + a (在行尾插入字符)
Shift + i (在行手插入字符)
o (下一行插入字符)
Shift + o (在当前行上行插入字符)
x (删除单个字符)
dd (删除整行字符)
二、编写程序
1、Hello world
编写一个a.c文件:
#include
int main(){
printf("Hello world\n");
return 0;
}
然后再linux下使用命令编译:
gcc a.c
然后会生成a.out文件,改文件为可执行文件。
然后执行该文件:
./a.out
执行结果为
Hello world
注意:执行可执行文件的时候,一定要带“./”否则无法执行。
2、多个源文件如何引用
首先,我们来编写两个文件,一个是主函数文件main.c,另一个是普通函数文件max.c.
vim操作方法(在命令模式下):
1.输入set nu打开行号。
2.在一个文件处于vim编辑下,输入“sp 文件名.c”(在打开本文件的情况下创建新文件,并分分屏显示)。
3.ctrl+w+↓,切换到分屏下面那个文档。
4.ctrl+w+↑,切换到分屏上面一个文档。
5.9dd:代码占九行,剪切代码。
6.p:粘贴。
7.wqa:退出并保存所有内容。
通过以上命令实现下图效果:
然后再使用gcc来编译
gcc命令:gcc main.c max.c -o main.out
(将main.c 和max.c 合在一起输出,main.out为新文件的文件名)
然后再运行main.out文件得到以下结果。
大数是33
注意:mian.c中的#include "max.c "
就是引用了max.c里面的函数,相当于把max.c赋值粘贴到了main.c中。
3、头文件与函数定义分离
(1)函数可以先编译成.o文件(机器语言文件),然后再和主文件一起编译成可执行文件。在源代码多的时候可以提高效率。例如我们队上面的max函数做处理:
先输入gcc -c max.c -o max.o
此时会生成max.o文件,max.o文件是已经编译好的机器码文件,无法查看和编写。然后我们再将main.c文件和max.o文件一起编译:
gcc main.c max.o
这样编译起来就很快了。
(2)但是.o文件不能被其他人查看,无法让函数使用者知道函数的详情,例如形参都分别是什么,返回值是什么。此时我们可以编写一个.h文件,还拿max函数举例,我们创建一个max.h文件,内容如下:
int max(int a,int b);
然后在主文件中进行预处理声明导入该文件。
#include
#include "max.h"
int main(){
int a1=10;
int a2=33;
int maxNum=max(a1,a2);
printf("大数是%d",maxNum);
}
通过查看.h文件别人就可以知道你编写的函数的类型了。
gcc 编译命令需要注意的几点:
1.若该文件在预处理的时候已经引入其他文件了,则在用gcc编译时不用再将引入文件一同编译。
2.若该文件在预处理的时候没有引入其他文件,或者只引入了相应的.h文件,那么编译时则需要将引入文件(.c文件或.o文件均可)一同编译。
4、使用Makefile工具
假设有很多.c以及.o文件的时候,我们就需要gcc后面跟一串.c文件等等,那么我们是否有很方便的命令来提高效率呢?
makefile工具就可以很清晰和快速的将文件进行整理,make内部使用了gcc。
首先我们检查一个我们是否安装了make工具,使用命令 make -v,若安装则显示安装信息,版本号码,若未安装,我们使用命令sudo apt-get install make(Ubantu的命令)或者 yum install make(CentOS的命令)。
(1)make工具的使用方式
1)首先我们将系统里的.o文件全部删除
输入命令rm -rf *.o
即可。
2)创建一个Makefile文件
使用命令创建一个名为Makefile的文件(注意大小写),我们约定一个文件makefile来进行我们之前写过的文件进行配置。
3)文件结构
①Makefile文件中可以写注释,以井号开头。
# this is make file
②还拿上面的例子举例,我们想生成一个main.out的可执行文件。
main.out是我们的目标文件,但其中需要max.o,main.c这2个文件一块编译,我们在makefile写下:
main.out:max.o main.c
③在下一行空6个空格之后,输入编译命令:
gcc main.c max.o
④然后再在下一行输入.o文件的来源和命令,我们的程序里只有一个max.o,则写为:
max.o:max.c
gcc -c max.c
最后该Makefile内容为
# this is make file
main.out:max.o main.c
gcc max.o main.c
# 同时我们写出max.o的文件来源
max.o:max.c
gcc -c max.c
最上面的文件是我们最终需要的文件main.out,同时它是由max.o,main.c,同时我们再给出这两个文件所依赖的文件(其实就是递归),找到各自的生成的源头文件。若最后我们没有在gcc中指定输出名称,则最后使用make命令(也就是直接命令make回车),就生成a.out文件,若要指定生成的文件名,我们就可以使用修改Makefile文件内的代码(改为gcc max.o min.o hello.c -o hello.out
)。
此外,还需要注意的是,在Makefile文件中,我们gcc命令前需要有6个空格(即一个TAB键),若不是6个空格,则在使用make命令时,则会报错导致无法生成.out文件等。
⑥运行Makefile文件
直接在当前目录输入命令:make
系统即可将所有的编译命令执行,并生成响应的.out文件,如下图所示:
三、main函数
1、main函数中的return
C语言程序在Linux或者Unix系统运行的时候,可以跟操作系统进行交互,交互方式就是在运行程序的时候,还可以输入参数(条件),系统运行完之后,有必要的话,再输出一些信息,例如一些返回值。Unix系统可以和C语言程序完美兼容。
main函数的完整形式:
int main(int argv,char* argc[]){
return 0;
}
例如我们编写一个程序
#include
int main(int argv,char* argc[]){
int a=0;
if(a==0){
printf("This is a seccessful test.\n");
return 0;
}else{
int err=111;
printf("This is a error test,error number is %d.\n",err);
}
}
将两个命令一起执行:命令一 && 命令二(带命令一成功执行后进行命令2),如下:
gcc test1.c && ./a.out
最后结果为:
此时我们再输入命令
echo $?
结果为:
如果我们连续2次运行a.out程序,都会执行,如下图所示:
两次均可执行!
如果我们将test1.c中的变量a改为1,编译后执行,再看看什么结果:
我们再输入命令
echo $?
看看:
不再显示0。
这时,我们再连续两次运行 a.out文件,则会出现如下结果:
我们看到这回只执行了1次!
也就是说:
echo $?
命令可以在程序执行后判断程序是否正常执行:返回0为正常执行,不返回0表示不正常执行。这个返回数字就是错误编号!所以main函数中return必须为0,才能让系统判断为正常执行。当你不写return的时候,如果程序运行成功的话,会自动返回0。
2、main函数中的参数
main函数的完整形式:
int main(int argv,char* argc[]){
return 0;
}
其中
int argv
是命令及参数的个数。例如输入命令./a.out -l -s -a
,argv的值就为4,分别为./a.out
、-l
、-s
、-a
,
char* argc[]是命令中的命令本身及参数组成的数组,其中argc[0]
就是./a.out
,argc[1]
就是-l
,argc[2]
就是-s
,argc[3]
就是-a
。
3、通过main函数命令输入长和宽,输出一个长方形小程序
首先我们介绍一个函数:atoi()
,该函数可以将字符型的数字转化成int类型的数字,例如将'28'转化成28。
int a=atoi('28');
接下来我们就来编写程序,命令的第一个条件为高,第二个条件为宽。程序代码为:
#include
int main(int agrv,char* argc[]){
int a=atoi(argc[1]);
int b=atoi(argc[2]);
int i;
for(i=0;i
用gcc命令编译后,出现a.out执行文件,我们来执行一下,画一个高为4、长为5的矩形,如下图所示: