数据结构与算法程序员C语言

慕课网-Linux C语言编程基本原理与实践-学习笔记

2017-08-21  本文已影响170人  天涯明月笙

个人整理,学习自用。课程内容by慕课网。

Linux C语言编程基本原理与实践

高效的学习带着目的性: 是什么 -> 干什么 -> 怎么用

重识C语言

  1. C语言是一种通用的, 面向过程的编程语言, 在系统与应用软件的开发应用较广
  2. 是人类和计算机交流的一种方式
  3. ANSI C: 是C语言的标准, 为了避免各开发商用的C语言语法的差异
  4. C语言的特点: 简单, 快速, 高性能, 兼容性好, 功能强大, 易于学习

C语言适合做什么

  1. Linux嵌入式, 小工具(命令行下的cd, ls之类的命令)
  2. 与硬件打交道的程序: 操作系统, ARM嵌入式, 单片机编程以及Arduino编程等等
  3. 对性能要求较高的应用程序: NGINX(C)的并发量 = Apache(C++) * 10

C适合领域

  1. 小工具(语法简单)
  2. 和硬件打交道的程序(有指针,可操作内存)
  3. 有高性能要求的程序
    nginx c apache c++
    linux嵌入式

linux下c环境:

Ubuntu:

  1. Ubuntu和CentOS是较为常用的Linux发行版本, 个人电脑用Ubuntu更好
  2. Ubuntu的kylin版对中文支持很好
  3. amd64版: AMD当初率先推出64位CPU, 所以Ubuntu把64位CPU型号定义为amd64(Intel照用), 一直沿用到现今; 32位用x86
  4. LTS版: 长时间的技术支持版本
  5. 装Ubuntu系统可以选择双系统, 也可在原来的Windows电脑上装虚拟机

PS: 尽量在Linux环境下开发C语言程序

Linux下最好用的文本编辑器: emacs, vim

linux下一般不用void main

vim分屏显示

终端下:

头文件与函数定义分离

代码没有main函数不能执行,main是入口。

gcc -c max.c -o max.o

gcc的编译流程分为4步:

预处理(Pre-Processing) -> 编译(Compling) -> 汇编(Assembling) -> 连接(Linking)

预处理:处理#include、#define、#ifdef 等宏命令

编译:把预处理完的文件编译为汇编程序.s

汇编:把汇编程序.s编译为.o二进制文件

hello.c代码:

#include <stdio.h>
#include "max.h"
#include "min.h"

int main()
{
    int a1 = 33;
    int a2 = 21;
    int maxNum = max(a1,a2); 
    int minNum = min(a1,a2);
    printf("the max value is %d\n",maxNum);
    printf("the min value is %d\n",minNum);
}

max.h 代码:

int maxNum(int a, int b);

min.h 代码:

int minNum(int a ,int b);

min.c代码:


int min (int a, int b)
{
    if(a<b){
        return a;
    }else{
        return b;
    }
}

makFile的编写

编写一个Makefile可以同时编译多个文件。

hello.out:max.o min.o hello.c
    gcc max.o min.o hello.c -o hello.out
max.o:max.c
    gcc -c max.c
min.o:min.c
    gcc -c min.c
# 添加注释

详细讲解main函数中的返回值的作用以及main函数中的参数意义

gcc main.c -o main.out && ./main.out

./main.out && ls打印出helloworld的同时,列出当前目录。因为main.out的return值为0,判定为成功执行。

./main2.out && ls打印出helloworld,未列出当前目录。因为main.out的return值为101(非0),判定为不成功执行。

main函数中的参数

int main(int argc, char* argv[])//main函数完整形式

argc获取输入参数的个数。只输入文件名为1.

argv[]存放每个参数的内容
如:

#include <stdio.h>

int main(int argc,char* argv[])
{
    printf("argc is %d\n",argc);
    //int i;
    for(int i =0;i<argc;i++){
    printf("argv[%d]is %s\n",i,argv[i]);
    }

    return 101;
}

Linux下的标准输入流输出流与错误流

linux把所有东西当作文件处理

#include <stdio.h>

int main()
{
    // printf("hello world!\n");
    fprintf(stdout,"hello world \n");
    int a;
    //scanf("%d",&a);
    fscanf(stdin,"%d",&a);
    if(a<0){
     fprintf(stderr,"the value must >0\n");
     return 1;
    }

    //printf("input value is: %d\n",a);
    return 0;

}

输出输出流与错误流的重定向

Linux几乎可以用于任何领域,这里我们不得不提出linux的通道,管道起到了很重要的作用,不同应用程序之间要配合使用,就需要用到管道。

demo:main.c

先理解输入流,输出流和错误流的重定向机制,对于管道的理解会比较容易些。

#include <stdio.h>

int main()
{
int i,j;
printf("input the int value i:\n"); \\printf其实对fprintf的封装,是从标准输出流(即stdout)来输出这个过程
scanf("%d", &i); //默认输入流是键盘
printf("input the int value j:\n");
scanf("%d", &j);
printf("i+j=%d\n", i+j);
}

输入流重定向

#include <stdio.h>

int main()
{
    int i,j;
    printf("input the int value i:\n"); 
    scanf("%d", &i); //默认输入流是键盘
    printf("input the int value j:\n");
    scanf("%d", &j);
    if(0!=j){   
        printf("%d/%d=%d\n",i,j,i/j);
    }else{
        fprintf(stderr,"j != 0\n");
        return 1;
    
    }


    return 0;
}

./a.out 1>t.txt 2>f.txt <input.txt

管道原理及应用。

管道:
把前面的输出流作为后面工具的输入流,用一个“|”表示.

  • ls /etc/ 的输出作为 grep 的输入,

ps -e | grep ssh

查看包含ssh的进程

实践编程,用简单的C语言代码,编写一个实用的C语言小程序

avg.c :

#include <stdio.h>

int main()
{
    int s,n;
    scanf("%d,%d",&s,&n);
    float v = s/n;
    printf("v =%f\n",v);
    return 0;
}

input.c:

#include <stdio.h>

int main()
{
    int flag =1;
    int i,s;
    int count=0;
    while(flag){
    scanf("%d",&i);
    if(0==i) break;
    count++;
    s+=i;
    }
    printf("%d,%d\n",s,count);
    return 0;

}

使用时:
./input.out | ./avg.out
实现将input的数据之间求平均值。

上一篇 下一篇

猜你喜欢

热点阅读