Linux C语言编程基本原理与实践 笔记 gcc max.o hello.c
一、简介
人类和计算机交流的一种方式。
C语言适合做Linux嵌入式。小工具。
MAC电脑是Unix内核。
二、Linux基本操作
#vi a.c新建文件
#rm a.c删除文件
i 当前光标前面插入
a当前光标后面插入
shift+a 行尾插入
shift+i 行首插入
o下一行插入
shift+o上一行插入
dd 删除光标所在行
三 Linux下第一个C程序
vim a.c
#include <stdio.h> int main () { printf("hello word !\n"); return 0; }
gcc a.c 编译得到a.out
./a.out 运行程序输出结果
第四章 多文件操作
多文件分而治之
vim在打开一个文件的时候可以同时打开另外一个文件。在命令状态下输入:sp max.c 就是新建一个max.c文件并同时打开。
Ctrl+w 可以在文件之间进行切换。
:set nu 打开行号
输入行号 按dd 剪切光标到行号的部分到剪切板。 p粘贴
gcc hello.c max.c -o hello.out 将hell.c和max.c编译到hello.out
头文件与函数定义分离
gcc -c max.c -o max.o首先编译max.c
gcc max.o hello.c 将编译好的max.o和hello.c一起编译。
头文件只声明就行。而且不用编译。直接保留在软件系统中。
第五章 makeFile 的编写与使用
make工具可以将大型的开发项目分成若干个模块。使用make工具很清晰很快捷的整理源文件。
首先查看是否安装了make工具。
vi MakeFile //貌似都是这个命名
# this is make file这是注释。gcc前面是一个Tab。
# this is make file hello.out:max.o min.o hello.c gcc max.o min.o hello.c -o hello.o max.o:max.c gcc -c max.c min.o:min.c gcc -c min.c
make 直接就执行MakeFile来编译程序。 重新执行的时候直接编译从来没有编译过的文件。
第六章 main 函数详解
main 函数中的 return
main 函数完整版。
# include <stdio.h> int main( int argv,char* argc[]) { printf("hello word"); return 0; }
gcc main.c -o main.out && ./main.out 这里的&&表示前面的执行成功之后执行后面的。如何判断第一句执行是否成功?
echo $? 输出执行结果是否成功(返回0表示正确执行,否则是失败了。)
这里echo输出的0是上面的return0;
修改后:
# include <stdio.h> int main( int argv,char* argc[]) { printf("hello word"); return 101; }
gcc main.c -o main2.out && ./main2.out 能够正常输出
echo $? 输出结果是101
./main2.out && ls 这里只能正常输出运行结果。&&后面的没有执行ls命令。
因此return 0;不能随便写。
main 函数中的参数
argv是参数的个数。argc[]存放参数的内容。
# include <stdio.h> int main( int argv,char* argc[]) { printf("argv is %d\n",argv); int i; for (i=0;i<argv ;i++){ printf("argc[%d] is %s!\n",i,argc[i]); } return 0; }
gcc main2.c -o m4.out 编译
eg1: ./m4.out 执行
执行结果
argv is 1
argc[0] is ./m4.out!
eg 2: ./m4.out qw werer ds 执行 并且给多个参数
执行结果
argv is 4
argc[0] is ./m4.out!
argc[1] is qw!
argc[2] is werer!
argc[3] is ds!
第七章输入输出流和错误流
标准输入流输出流以及错误流
#include <stdio.h> /* *stdio标准输入流 默认键盘 *stdout标准输出流 显示器终端 *stderr标准错误流 */ int main () { // printf("please input the value a :\n"); fprintf(stdout,"please input the value a :\n"); int a ; //scanf("%d",&a); fscanf(stdin,"%d",&a); if(a<0){ fprintf(stderr,"the value must >0.\n"); return 1; } return 0; }
./a.out 运行程序
please input the value a :
-1 输入的内容
the value must >0
echo $? 查看程序运行结果
1返回错误的1
重定向
# include <stdio.h> int main () { printf("input the int value i:\n "); int i ,j; 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; }
输出重定向 ll /etc >>a.txt 追加到结尾
ll /etc >>a.txt 覆盖原有内容
输入重定向 ./a.out < input.txt 将输入内容放在input.txt中
错误流重定向 ./a.out 1>t.txt 2>f.txt 标准正确输出到t.txt 错误信息 返回2输出到f.txt
第八章 管道原理及应用
ls /etc 查看etc文件下的文件名
ls /etc | grep ab 将命名ls /etc输出的结果输入给后一个命令。gerp是查询命令。管道|将前一个命令执行结果的输出流作为后一个命令的输入流。
ps -e 查看进程。
第九章 打造实用C语言小程序
//avg.c # include <stdio.h> int main () { int s ,n; scanf("%d,%d",&s,&n); float v; v =s/n; printf("v=%f \n",v); return 0; } //count.c # include <stdio.h> int main () { int flag=1; int i; int count =0; int s=0; while (flag){ scanf("%d",&i); if(0==i) break; count ++; s+=i; } printf("%d,%d",s,count); return 0; }
编译之后
./count.out | ./avg.out
1
2
3
0
v=2.000000