3.7 命令行参数
指针的编程艺术(第二版)
在C程序语言中,函数是平等的,而main() 函数是程序的进入点。在执行程序时可以附加一些选择项,这有点类似早期DOS(现称为命令行参数模式)的指令或UNIX的指令,如DOS的dir/w,其中的/w为一个选择项,表示当执行dir指令时,是以wide的模式输出,如UNIX下的
ls -l –a```
ls与dir指令具有相同的功能,其中-l和-a都为附加的选择项。
假设有个排序的程序,并且在此程序中有递增(由小至大)和递减(由大至小)的功能。不同的用户,其使用的功能也会不同,为了达到这个目标,可使用命令行参数(command-line argument)来{XE "命令列引數(command-line argument)"};完成。
具备命令行参数的程序,只要将程序的main( )函数改为
int main(int argc, char *argv[])`
这条语句多加了两个参数,第一个为argc,表示参数个数(argument count){XE "rgc,表示參數個數(argument count)"},其数据类型是int,另一个为argv,表示参数向量(argument vector){XE "argv,表示參數的向量(argument vector)"},它是指向一个数组指针的变量,这个数组的每一个元素都为指向某一字符串的指针。argc和argv名称不是绝对的,你也可以选取你喜欢的名称。我喜欢这个名称的原因是因为可以很容易了解其代表的含义。
命令行参数的重点在于判断有无附加的选择项,以及如何得到那些附加的选择项,以便进一步的工作。
当argc > 1时,表示有附加的选择项,可使用argv取得,例如,有一程序sort.c,经compile及link得到一个执行文件sort.exe(假设在C:prog的目录下),因此,可在命令行提示符的模式下,输入以下的数据,
C:\prog>sort -n –r```
其中-n表示要排序的数据是数字,不是字符串。而-r表示使用降序功能来排序,此时argc为3,而argv可以用下图表示。
<div style="text-align: center">
<img src="https://yqfile.alicdn.com/339dec60209affbfad9ecc5470b639a549646a7a.png" >
</div>
argv指向数组的第一个元素的指针变量,所以*argv == argv[0]。argv[0]是指向“C:\prog\sort.exe” 字符串的指针,argv[1]是指向“-n”字符串的指针,而argv[2]为指向“-r”字符串的指针。由于argv是指针变量,因此argv可搭配递增或递减运算符,如argv++。argv[0]则是当前argv所指向地址的内容,当argv指针改变其指向的地址时,argv[0]也会随之改变。
“-n”中的‘-’字符,可使用*(argv[1])取得,而*(argv[1]+1)可得到“-n”中的n。其实*(argv[1])相当于**(argv+1),而*(argv[1]+1)相当于*(*(argv+1)+1),依此类推,“-r”中的‘-’字符可使用*(argv[2])获得,所以*(argv[2]+1)可得“-r”中的r。
接下来,以范例commandLine-1说明命令行参数的使用方法。
范例commandLine-1
/ commandLine-1.c /
include
include
int main(int argc, char *argv[])
{
int i;
printf("argc = %dn", argc);
for(i=0; i printf("argv[%d]=%sn", i, argv[i]);
printf("(argv[2]+2)=%cn", (argv[2]+2));
printf("((argv+2)+2)=%cn", ((argv+2)+2));
printf("n");
getch();
return 0;
}
输出结果
<div style="text-align: center">
<img src="https://yqfile.alicdn.com/15de079b19f67333d364ffa47462f79665d06822.png" >
</div>
这种命令行参数的程序,必须在命令提示符的模式下才能执行,如果我们将commandLine-1.exe(此文件生成在commandLine-1.c所在的目录下)复制到c:\ 的目录下,并输入以下的数据,
```C:\commandLine-1 Hello world```
输出结果如上图所示。
*(argv[2]+2)与*(*argv+2)+2所得到的结果都是字符r。用图形表示如下。
<div style="text-align: center">
<img src="https://yqfile.alicdn.com/b832d1fce95f7f0e9b20a1af5798ccf98d763322.png" >
</div>
再来看看范例commandLine-2,它是模仿dir/w及type的系统指令的操作。
范例commandLine-2
/ commandLine-2.c /
include
include
int main(int argc, char *argv[])
{
if (argc == 2) {
switch(*(argv[1]+1))
{
case 'd':
system("dir/w c:\");
break;
case 't':
system("type c:\commandLine.c");
break;
default:
printf("Using commandLine -d or -t");
}
}
else
printf("Using commandLine -d or -t");
printf("n");
getch();
return 0;
}
输出结果
下图是以commandLine-2 –d命令行所得到的结果。
<div style="text-align: center">
<img src="https://yqfile.alicdn.com/88c8736fef3e691ecf7e09efc6341a0df403ef8f.png" >
</div>