C语言笔记(学习开发一个linux小程序)

一、准备工作

语言是基于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 <stdio.h>

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:退出并保存所有内容。
通过以上命令实现下图效果:


Vim分屏显示.png

然后再使用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 <stdio.h>
#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文件,如下图所示:

image.png

三、main函数

1、main函数中的return

C语言程序在Linux或者Unix系统运行的时候,可以跟操作系统进行交互,交互方式就是在运行程序的时候,还可以输入参数(条件),系统运行完之后,有必要的话,再输出一些信息,例如一些返回值。Unix系统可以和C语言程序完美兼容。
main函数的完整形式:

int main(int argv,char* argc[]){
    return 0;
}

例如我们编写一个程序

#include <stdio.h>
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

最后结果为:

image.png

此时我们再输入命令echo $?
结果为:
image.png

如果我们连续2次运行a.out程序,都会执行,如下图所示:
image.png

两次均可执行!

如果我们将test1.c中的变量a改为1,编译后执行,再看看什么结果:

image.png

我们再输入命令echo $?看看:
image.png

不再显示0。
这时,我们再连续两次运行 a.out文件,则会出现如下结果:
image.png

我们看到这回只执行了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.outargc[1]就是-largc[2]就是-sargc[3]就是-a

3、通过main函数命令输入长和宽,输出一个长方形小程序

首先我们介绍一个函数:atoi(),该函数可以将字符型的数字转化成int类型的数字,例如将'28'转化成28。

int a=atoi('28');

接下来我们就来编写程序,命令的第一个条件为高,第二个条件为宽。程序代码为:

#include <stdio.h>

int main(int agrv,char* argc[]){
    int a=atoi(argc[1]);
    int b=atoi(argc[2]);
    int i;
    for(i=0;i<a;i++){
        int j;
        for(j=0;j<b;j++){
            if(j==b-1){
                printf("*\n");
            }else{
                printf("*");
            }
        }
    }
    return 0;
}

用gcc命令编译后,出现a.out执行文件,我们来执行一下,画一个高为4、长为5的矩形,如下图所示:


image.png
禁止转载,如需转载请通过简信或评论联系作者。