《指针的编程艺术(第二版)》一3.7 命令行参数

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>
时间: 2024-09-25 16:44:08

《指针的编程艺术(第二版)》一3.7 命令行参数的相关文章

《指针的编程艺术(第二版)》一3.5 指向数组的指针

3.5 指向数组的指针 指针的编程艺术(第二版)ptr[4] 和 (ptr)[4] 所表示的意义是不同的.ptr[4]已在前面讨论过了,而(*ptr)[4]是指向数组的指针(pointer to array){XE "指向陣列的指標(pointer to array)"},表示ptr是一指针,指向一个有4个元素的数组,其实它也可视为是一个二维数组ptr[][4],因为和[]是互通的,我们以范例pointerToArray-1来说明. 范例pointerToArray-1 / point

《指针的编程艺术(第二版)》一3.10 程序实战

3.10 程序实战 指针的编程艺术(第二版) 1.试以命令行参数,在命令行提示符的模式下,模拟两个整数的算术运算(加.减.乘.除)的功能,如下所示: calculate + 表示a加b的意思.而: calculate - 表示a减b的意思,其中a与b变量为已知.依此类推.

《指针的编程艺术(第二版)》一第三章 指针与数组3.1 指针与一维数组

第三章 指针与数组 指针的编程艺术(第二版) 3-1 指针与一维数组 3-2 指针与二维数组 3-3 数组指针 3-4 为什么parr等同于 *parr? 3-5 指向数组的指针 3-6 多重指针 3-7 命令行参数 3-8 改错题 3-9 练习 3-10 程序实战 指针其实就是一个地址.数组的名称,表示这个数组的第1个元素的地址,所以它也是指针.由此可知,指针与数组的关系是很密切的.为了与指针变量(pointer variable){XE "指標變數(pointer variable)&quo

《指针的编程艺术(第二版)》一3.2 指针与二维数组

3.2 指针与二维数组 指针的编程艺术(第二版) 一维数组与指针的关系前面已经介绍过.一维数组的元素值,可使用[]或一个*得到,假设有一个数组如下: int i[7] = {0, 1, 2, 3, 4, 5, 6}; int *ptr=i; 则(i+2) 或i[2] 或(ptr+2) 或ptr[2],都表示数组某一个元素的值.而二维数组(two dimension array){XE "二維陣列(two dimension)"},则需要两个,或一个与一个[ ],或两个[ ],才能得到数

《指针的编程艺术(第二版)》一3.4 为什么parr等同于 *parr?

3.4 为什么parr等同于 *parr? 指针的编程艺术(第二版) 因为一个指针相当于一维数组,所以可将上述的数组指针 char *parr[4] = {"Department", "of", "Information", "Management"}; 改为以二维数组的方法表示,如下语句所示. char parr[4][12] = {"Department", "of", "

《指针的编程艺术(第二版)》一第一篇 C语言篇

第一篇 C语言篇 指针的编程艺术(第二版)C语言最早是在AT&T(American Telephone and Telegraph,美国电话与电报公司)内部使用的语言,但为了发布UNIX操作系统,不得不公开这一程序语言.主导这语言的两个灵魂人物,分别是Dennis Ritchie与Brian Kernighan.ANSI C已于1989年公布.Dennis Ritchie生于1941年,哈佛大学数学博士,是C语言之父.Brian Kernighan目前在普林斯顿大学计算器科学系(Departme

《指针的编程艺术(第二版)》一2.4 练习

2.4 练习 指针的编程艺术(第二版)1.请问下面程序的输出结果是什么?并说明其含义. /* exercise2-1.c */ #include <stdio.h> #include <conio.h> int main() { char *diamond="拉钻石"; char *p1 = diamond; char **p2 = &p1; char ***p3 = &p2; printf("diamond=%p\n", d

《指针的编程艺术(第二版)》一3.6 多重指针

3.6 多重指针 指针的编程艺术(第二版)多重指针(multiple pointer){XE "多重指標(multiple pointer)"},指的是在一个语句中有2个或以上的*.我们以范例starstarPointer-3来说明. 范例starstarPointer-3 /* starstarPointer-3.c */ #include <stdio.h> #include <conio.h> int main() { int i[5]={10, 20,

《指针的编程艺术(第二版)》一第一章 内存的基本概念1.1 变量

第一章 内存的基本概念 指针的编程艺术(第二版)1-1 变量 1-2 一维数组 1-3 二维数组 1-4 结构 1-5 练习 当程序定义一个变量时,编译程序根据其数据类型分配适当大小的内存给它,以便存储数据.这就如同地址一般,邮差根据收件人的地址,将信件投入正确的信箱. 1.1 变量 指针的编程艺术(第二版)程序以变量名称代表某一事项,就好比每一个人都有姓名一般.如果有人喊"蔡明志",那我一定会说"到",因为这个名字就代表我的意思.我们就从变量开始谈起.请参阅范例a

《指针的编程艺术(第二版)》一第二章 指针与变量2.1 一颗星星:表示一把钥匙

第二章 指针与变量 指针的编程艺术(第二版)2-1 一颗星星:表示一把钥匙 2-2 两颗星星:表示两把钥匙 2-3 三颗星星:表示三把钥匙 2-4 练习 如果要间接访问某一变量值,我们可使用指针来完成. 2.1 一颗星星:表示一把钥匙 指针的编程艺术(第二版)本章将介绍指针变量(pointer variable)与一般变量的关系.首先介绍的是,如何定义一个指针变量,如下所示. int x=100; int *ptr = &x; 上述语句表示下列3种含义. 1.ptr是一个指针变量. 2.ptr变