-
【错误流】 我们将程序进行一些修改,如下: #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; } 对程序进行编译cc main.c,得到./a.out,分别根据提示输入8和4得到结果“8/4=2”,我们使用命令echo $?,得到0说明程序正常输入,下面我们来测试一下错误流,再次执行程序./a.out,我们输入8和0,并使用echo $?命令得到返回值为1,则有错误流显示的结果“j != 0”。 我们能否将正确和错误的结果分别倒入(写文件的方式)到不同的文件中去呢?命令我们写./a.out 1>t.txt 2>f.txt,正确的导入到t.txt中,错误的导入到f.txt。同样地,我们还可以把输入流加到刚才的命令中去。 根据以上讲的,有: 标准输入流 ==> 键盘输入 标准输出流 ==> 终端输出 标准错误流 ==> 错误输出 我们再结合通道,就可以写出有实际意义的命令来。查看全部
-
【编写使用管道的程序】 我们在文件夹下,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; } 退出vim进行编译cc avg.c -o avg.out,我们得到avg.out,我们输入3000,3。 我们再写一个统计输入的程序input.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\n",s,count); return 0; } 我们对这个函数进行编译cc input.c -o input.out,我们输入3000 2000 0,输出总工资5000和人数2。 我们不妨使用以上两个程序结合起来,将所有数据进行统计input.out,之后通过管道经过avg.out计算平均值,命令可以写为./input.out | ./avg.out,然后进行输入,输入完成我们便得到了对应的平均工资。 以上就是通过管道,将两个小程序连接起来得到更复杂的程序的过程。查看全部
-
【管道原理及应用】 Linux系统自带的小工具如何使用,其实这些小工具就是一个应用程序,比方说ls /查看根目录,比方我们要查找某个目录下有多少个文件名包含“ab”,我们可以写ls /etc/ | grep ab,其中这个竖线就是管道的意思,grep是从文本文档中查找指定的行(其实可用于文本搜索)。 将我们前一个程序执行输出流,通过管道得到我们需要的内容。通过管道我们就可以使用很多自动化的方法,管道的应用还有很多。 例如,ps可以查看当前的进程,我们想查看我们当前操作系统是否开启ssh进程,我们可以使用命令ps -e | grep ssh,查看所有进程中是否包含ssh服务的,若有我们便可以进行连接。查看全部
-
1.cp 拷贝查看全部
-
【main函数中的参数】 我们使用命令cp main.c main2,c,复制并创建一个main2.c文件: #include <stdio.h> int main(int argv, char* argv[]) { print("argv is %d \n", argv); return 0; } 我们在使用命令cc main2.c -o m2.out进行编译,执行./m2.out命令,有“argv is 1” 对于ls我们可以在此命令上加参数,例如: 显示更多的文件信息:ls -l 显示隐藏的文件信息:ls -a 那么,同理,我们也可以对./m2.out这个可执行文件加参数。分别执行如下命令并观察输出: ./m2.out,输出为“argv is 1” ./m2.out -l,输出为“argv is 2” ./m2.out -l -a,输出为“argv is 3” 我们可以观察到,加不同个数的参数,argv返回对应参数的值,我们不仅要知道几个参数,我们还可以知道每个参数是什么,我们将程序进行修改,加上如下一段代码: int i; for(i=0; i<argv; i++) {//在vs或者xcode里,可以在for内声明int i,但是在c98下不能这么写,会报错,是因为版本的问题 printf("argc[%d] is %s\n", i, argc[i]); } 这时,我们再编译gcc main2.c -o m3.out,运行./m3.out -l -a asadf sdfd有如下显示: argv is 5 argc[0] is ./m2.out argc[1] is -l argc[2] is -a argc[3] is asadf argc[4] is sdfd 以上内容和linux,unix联系非常紧密,尤其是在linu嵌入式,linux小工具的开发,以及linux的网络编程,都是很重要的内容。查看全部
-
【输入流重定向】 我们可以创建一个文件vi input,txt,内容如下: 6 8 我们再次执行./a,out < input.txt,不存在追加模式,所以我们用单箭头<,我们可以将要输入的内容全部在input.txt中准备好,命令执行后,我们便在终端上可以看到结果。查看全部
-
【输入输出流以及错误流的重定向机制】 Linux几乎可以用于任何领域,这里我们不得不提出linux的通道,管道起到了很重要的作用,不同应用程序之间要配合使用,就需要用到管道。 我们这里先给出一个例子main.c,主要介绍输入流,输出流和错误流的重定向机制,对于管道的理解会比较容易些。 #include <stdio.h> int main() { 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); } 执行命令编译cc main.c,得到a.out,运行a.out,我们分别输入3和5输入到终端。我们标准输出流是1,输出入是0。我们可以使用命令./a.out 1>> a.txt,其中>>符号(不写参数就是输出流),之前默认输出流是终端,现在我们则改为输出到a.txt中,我们执行命令后,分别输入3回车后再输入5。再使用命令cat a.txt,我们可以看到我们已经输出到文件里的内容。 我们再次执行./a.out >> a.txt,我们再次输入参数,完成后我们再次使用cat来查看a.txt文件里的内容,发现之前的内容还在,新的输出内容追加到了后面。 再举一个重定向的例子,我们使用命令ls /etc >> etc.txt,我们将ls目录下的内容输入到了etc.txt文件中;但我们如若改重定向符号想覆盖掉之前的内容,可以把双箭头>>改为单箭头>,则文件中先前的内容就会被覆盖掉。查看全部
-
【标准输入流,输出流,错误流】 现在有cio.c文件: #include <stdio.h> //标准输入输出 /* stdin stdout stderr */ int main() { printf("hello world!\n"); //输出功能由标准输出流完成,printf是系统封装后的 int a; scanf("%d", &a); //标准输入流,错误流是系统出错的时候的 printf("input value is : %d\n", a); return 0; } 在我们输入a.out时,当程序执行的一瞬间,系统给程序提供了一个进程,当程序启动时,系统也提供给程序一系列的指针。linux将所有的外设(摄像头,打印机云云)也罢等等,都视为文件。当启动应用程序时候,也当文件操作,会产生三个文件(stdin,stdout,stderr,即标准输入,输出,错误流)。 默认情况下,输入流就是键盘,stdout也可以切换默认为显示器,我们可以切换为网卡或者打印机,错误流同理。我们在启动文件的时候,都会产生这三个文件。 printf函数是一个封装过的函数: printf("Please input the value a:\n"); fprintf(stdout, "please input the value a:\n"); 因为stdout默认是显示器,上两句就是等价的,printf其实就是fprintf封装后得到的。 同样,我们也有scanf和fscanf的关系(下面两句是等价的): scanf("%d", &a); fscanf(stdin, "%d", &a); 同样,我们也有错误流: if(a<0){ fprintf(stderr, "the value must > 0\n"); return 1; } return 0; 如何让程序知道出错了,我们通过返回值1和0体现,再次编译cc cio.c -o a2.out,我们运行a2.out,输入2则正常执行,当输入-1,则有我们对应的提示,即错误流就发挥作用了。 其实Linux一个很大的系统,就是由这些类似的小工具完成的,当等于0是为正确,错的话为其他值。当然,标准的输入流,输出流,以及错误流也可以重定向。查看全部
-
【关于return 0和命令连接符&&】 我们分别对main.c程序进行修改(return后一个为0,一个为101),分别生成main.o和main2.o文件。 return 0:gcc main.c -o main.o return 101:gcc main.c -o main2.o 之后我们使用命令./main.o && ls和./main2.o && ls,发现前者即返回hello world!同时显示了当前的目录(其中ls为显示当前目录命令),但是后者却只返回hello world!,即&&符号后面的语句没有执行。我们两个命令执行后,分别执行echo $?命令,前者返回0,后者返回101。 我们知道&&是and操作,需要前一句执行正确才能执行and(即&&)后面的内容。对于上面的那个例子,我们不禁可以推断出,0在linux下即为(程序执行)正确的意思,因此才会执行&&后面的ls命令。查看全部
-
【更深入了解c语言在linux下的交互】 建立一个main.c文件 #include <stdio.h> int main(int argv, char* argc[]) { printf("hello world!\n"); return 0; } 我们使用命令 gcc main.c -o main.out && ./main.out linux通过&&符号将两个指令作为一个指令输出了,但是linux是如何确定第一条指令是否正确输出了呢? 我们再次使用./main.out,然后可以使用命令echo $?,若返回0则说明程序正常,但是若为别的数字则说明程序执行失败了,返回的是一个错误码(好比windows下蓝屏了,就会返回一个错误码)。 返回正确则会返回0,是因为我们的程序里面最后写的是return 0,但当我们将这个return 0改为reutrn 101后,我们再使用指令echo $?,发现返回的是101。查看全部
-
假设有很多.c以及.o文件的时候,我们就需要gcc后面跟一串.c文件等等,那么我们是否有很方便的命令来提高效率呢? make工具就可以很清晰和快速的将文件进行整理,make内部使用了gcc。 首先我们检查一个我们是否安装了make工具(使用命令 make -v,若安装则显示安装信息,版本号码,若未安装,我们使用命令sudo apt-get install make)。 我们约定一个文件makefile来进行我们之前写过的文件进行配置。 makefile文件中可以写注释,以井号开头。 hello.out是我们的目标文件,但其中需要max.o,min.o,hello.c这三个文件,我们在makefile写下: # this is make file。注意 hello.out:max.o min.o hello.c gcc max.o min.o hello.c # 同时我们写出max.o的文件来源 max.o:max.c gcc -c max.c min.o:min.c gcc -c min.c 删除以o为后缀的文件:rm *.o 最上面的文件是我们最终需要的文件hello.out,同时它是由max.o,min.o,hello.c,同时我们再给出这三个文件锁依赖的文件(其实就是递归),找到各自的生成的源头文件。若最后我们没有在gcc中指定输出名称,则最后使用make命令(也就是直接命令make回车),就生成a.out文件,若要指定生成的文件名,我们就可以使用修改Makefile文件内的代码(改为gcc max.o min.o hello.c -o hello.out)。 此外,还需要注意的是,在Makefile文件中,我们gcc命令前需要有6个空格(即一个TAB键),若不是6个空格,则在使用make命令时,则会报错导致无法生成out文件等。查看全部
-
如果是别人提供的o文件,我们无从知道该o文件原本对应的c文件的函数输入输出是什么(cat max.o,我们无法看到文件内容,因为是机器码),对此,在我们建立o文件的时候,我们可以(模仿stdlib.h的形式)同时写一个h文件。 例如,我们先对max.c文件使用gcc命令生成max.o文件,然后创建一个max.h文件(vim max.h),然后在这个文件里写上int max(int a, int b);,同时在我们的主函数文件main.c中加上#include "max.h";(别人在使用我们写过的max函数的时候,即便不知道函数执行的具体内容但能看到这个函数需要什么样的传递参数和返回值类型)。在编译的时候,我们使用命令 gcc max.o max.h main.c。查看全部
-
我们可以将max.c和min.c分别用gcc命令(gcc max.c -o max.o和gcc min.c -o min.o)编译成max.o和min.o,我们平时可以将平时很少改动的函数编译成静态库,提高效率,需要编译时,我们直接gcc max.o max.o main.c即可。我们可以将max.c和min.c分别用gcc命令(gcc max.c -o max.o和gcc min.c -o min.o)编译成max.o和min.o,我们平时可以将平时很少改动的函数编译成静态库,提高效率,需要编译时,我们直接gcc max.o max.o main.c即可。查看全部
-
拷贝命令:cp max.c min,c,将文件max.c拷贝一份为min.c 我们可以将max.c和min.c分别用gcc命令(gcc max.c -o max.o和gcc min.c -o min.o)编译成max.o和min.o,我们平时可以将平时很少改动的函数编译成静态库,提高效率,需要编译时,我们直接gcc max.o max.o main.c即可。查看全部
-
返回到上面的vim分栏:Ctrl+w+↑ 9dd(代码占九行,剪切代码) 函数黏贴p 退出:wqa(a即所有,所有文件都退出并保存) 两个文件编译:gcc max.c hello.c -o main.out -o后面是输出文件的名称 我们应该在程序#include <stdio.h>下面声明包含max函数的文件(加上#include "max.c",这句相当于将max.c文件复制黏贴进hello.c文件中),这时,我们就可以不需要编译两个文件,只需gcc hello.c即可得到输出文件。查看全部
举报
0/150
提交
取消