vlambda博客
学习文章列表

C语言中的命令行参数

在大多数时候,编写 C 语言程序的 main 函数部分,都会写 int main()。main 函数也可以传递参数,程序员可以在外部控制程序,而不是在代码内对特定的值进行修改,这可以节省一定的时间。当在 main 函数中传递参数的时候,就要按下面的格式书写 main 函数:

int main(int argc,char *argv[])int main(int argc,char **argv)

这两种方法是等效的,第一个参数 argc 表示传入的参数的个数,*argv[] 是一个指针数组,里面存放的是指针指向的所有命令行参数,每个命令行参数都用字符串格式表示。下面展示命令行参数的具体用法:

#include<stdio.h>int main(int argc,char **argv){ int i; printf("There are %d parameters from command line.\n",argc); for (i=0;i<argc;i++)        printf("%d parameter is %s\n",i,argv[i]);}

假设编译之后的可执行文件名为 a.out,在命令行输入 ./a.out 2 3,得到的结果是:

可以看到,第一个命令行参数是可执行文件名,需要格外注意的是这里传入的2和3输出的时候都是按照字符串格式。如果需要在程序中使用传入的数字的话,可以使用 atoi,atof 函数将字符串分别转化成整型和浮点型数字。有时候为了确保传入的命令行参数的个数确实是我们想要的,会在程序中加入一个判断语句,这样可以避免程序出错。

命令行参数和 shell 脚本配合,可以有效提高程序员的工作效率,举个例子,现在想利用命令行参数的形式计算半径为2,3,4的三个圆的面积,通常情况下,需要手动运行三次程序,每次传递一个半径的参数。但是,我们可以在 shell 脚本中完成这个过程,这个 shell 脚本可以写成:

#!/usr/bin/bashgcc argc_circle.c -o circlefor ((i=2;i<=4;i++))do    ./circle $idone

在 shell 脚本中不仅完成了对命令行参数的输入,还顺便对源代码进行了编译,为了方便描述,将这个 shell 脚本命名为 circle.sh。这个 C 语言程序可以写成:

#include<stdio.h>#include<stdlib.h>#include<assert.h>#define PI 3.1415926int main(int argc,char **argv){ float radius,area; assert(argc==2); radius=atof(argv[1]); area=PI*radius*radius; printf("radius=%f\tarea=%f\n",radius,area);}

在上面的代码中使用 assert 函数对命令行参数的个数进行了判断。完成了这两部分代码的编写和调试之后只需要运行 circle.sh,就可以依次计算出三个圆的面积。虽然前期在设计程序的过程中会花费较多的时间,但是在后期运行的时候,可以避免做一些重复性的工作,通过少量的代码就可以控制一个较大的程序的运行,当处理的工作比较复杂的时候,这种做法确实可以提高工作效率。