当前位置:文档之家› C语言编程实战-4-命令行参数(main函数)处理

C语言编程实战-4-命令行参数(main函数)处理

如果执行:
test arg1arg2
则main函数得到的参数是:argc = 3, argv = {“test”,“arg1”,“arg2”};
如此类推。
通过上面的讲解,我们不难在main函数中实现对命令行参数的代码。我们接下来做一个编程任务:
写一个程序,该程序接收两个参数,这两个参数都是整数,程序中需将这两个整数的和与差计算并输出到屏幕上。假设程序的名称为cal,在命令行执行:
cal 10 15
则程序输出:
10 + 15 = 25
10–15= -5
如果输入的参数不合法,则提示参数错误。
代码实现:
#include <stdio.h>
int main(int argc, char *argv[])
{
if (argc != 3)
{
printf("参数错误!\n");
}
else
{
int a = atoi(argv[1]);
int b = atoi(argv[2]);
printf("%d + %d = %d\n", a, b, a + b);
printf("%d - %d = %d\n", a, b, a - b);
}
return 0;
}
在主函数的第一行,我们先对命令行传入的参数个数进行检查,因为cal命令行程序有两个参数,加上程序名称本身,参数个数应该为3才合法,所以当参数个数不为3时,肯定是非法,程序打印错误并退出(注意:示例程序中没有实现对参数格式的检查,如argc=3,但传入的参数不是合法的整数,这需要用户自行去添加代码实现)。如果参数正确,则从命令行获取参数,其对应的代码为:
一个标准的C程序,其主函数通常是这样子定义的:
int main(intargc,char *argv[])
{
//用户代码
return xxx;
}
main函数有两个参数:argc与agv,前者是一个整数,表示命令行给程序参数的个数,后者是一个字符串数组,用于顺次存放命令行传给程序的参数,通过argc与argv,我们就能实现对命令行参数的处理。
通过上面的讲解,我们已经能够处理命令行参数了,如cal程序的argv[1]与argv[2]。那么argv[0]有什么用呢?对于很多程序而言,argv[0]没有必要处理,除非你的代码真的需要判断自己的命令行程序名。如同一份代码实现了两个功能,编译连接生成程序后,将程序复制成两份,一份命名p1,一份命名p2,p1中执行功能1,p2中执行功能2,这时程序就要对argv[0]进行判断,用于选择执行不同的功能。使用argv[0]区分运行功能最著名的程序是busybox,在Linux系统中,我们有一个busybox程序,它在一个程序中集成了所有bash命令,同时以链接的方式生成ls, ps, top, ifconfig等这么一系列的命令,我们执行ls,实际上是运行了busybox,只是这时候busybox主函数得到的argv[0]是”ls“,因此busybox程序就能正常跳到ls功能代码运行。
命令行(main函数)参数处理
我们在执行某某命令的时候,经常会传入一些参数,告诉程序做不同的处理。如使用gcc编译程序时,我们经常会在后边指定c源码文件,如gcc test.c。我们自己写的程序,如何能够算其它命令一样,能够接收和处理不同的参数呢?答案是肯定的。我们今天来介绍自写程序对命令行参数的处理。
int a = atoi(argv[1]);
int b = atoi(argv[2]);
很明显,我们代码获取命令行参数的时候,第一个参数取的是argv[1],第二个是argv[2],跳过了argv[0],因为argv[0]是程序名称,我们这里用不到。由于参数是ቤተ መጻሕፍቲ ባይዱ字符串形式传入的,所以我们使用了atoi对其进行了转换,atoi的作用是将字符串转化成数字,如将字符串“123”转化成数字123。
对每一个程序而言,程序的名称总会作为命令行的第一个参数传给它的主函数,那怕命令行中并没有传任何参数。因此,主函数的参数argc最小值为1,argv[0]总是存放命令程序名。因此,假使test是我们程序的名字,如果执行:
test
则main函数得到的参数是:argc = 1, argv = {“test”};
相关主题