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

简介:

本节书摘来自异步社区《指针的编程艺术(第二版)》一书中的第3章,第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>
相关文章
|
编译器 C++
指针进阶 - 2(数组参数和指针参数)
指针进阶 - 2(数组参数和指针参数)
314 0
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
程序员 C语言
指针在函数参数和返回值中的使用
指针在函数参数和返回值中的使用
系统日志使用问题之如何防止在打印参数时遇到NPE(空指针异常)
系统日志使用问题之如何防止在打印参数时遇到NPE(空指针异常)
|
存储 C语言
字符指针作为函数参数
字符指针作为函数参数
451 2
|
C语言
用结构体变量和结构体变量的指针做函数参数
用结构体变量和结构体变量的指针做函数参数
628 3
|
安全 C语言 C++
字符指针做函数参数
字符指针做函数参数
300 1
|
安全 C语言
字符指针作函数参数的深入探索
在C语言编程中,字符指针是一个重要的概念,尤其在处理字符串和文本数据时。当我们将字符指针作为函数参数时,可以实现多种灵活和高效的操作。本文将深入探讨字符指针作为函数参数的应用,并通过代码示例加以说明。
334 1
|
C语言 C++
指针变量作为函数参数
指针变量作为函数参数
420 1