C语言的命令行参数(转载学习)

来源:互联网 发布:天猫和淘宝的关系 编辑:程序博客网 时间:2024/04/29 21:51

 命令行参数的最大作用就是让我们可以在程序之外控制程序,例如linux或者dos中我们经常使用的命令,从本质上将是一个程序;而我们使用的参数,就是该命令(对应的程序)的命令行参数。

         正是由于命令行的这么重要的作用,所以它成为各种编程语言不可缺少的功能,只是实现细节上略有不同,但大体上都是一样的,而且都比较简单。

1. 先想一想

1.1 程序中在哪里接收命令行参数(where)

         命令行参数,顾名思义,就是在命令行调用程序时传递的参数,那么谁来接收呢,一定是main函数了,因为程序是从main函数开始执行的啊。那作为一个函数,main怎么接收参数呢,很明显,用参数接收是最简单的方式。

1.2 程序中怎样接收去接收参数(how)

        想一下现在linux或者dos命令中使用参数的形式,你是否能想到一个比现在的方式更简单的方式:【命令 选项 参数】。我是想不出来了,那么针对这种方式,如何来接收呢。其实也很简单,因为它们使用空格分开的,所以我们只要将它们作为字符串依次存在一个数组就行了,也就是使用一个指针数组,每个元素是一个字符指针。对于数组我们经常使用的一个特性就是数组的长度,为了防止每次都自己编写代码求长度(实际上是重复劳动,因为求一个指针数组的长度代码是固定的),所以显式的提供给我们这个长度是比较好的。

2. 如何使用

        将main函数的声明为如下形式:

[cpp] view plaincopyprint?
  1. int main( int argc, char *argv[]){  
  2.   
  3. /* 这里省略了函数体内容 */  
  4.   
  5. }  

      注意事项:

        1. argv是一个指针数组,要明白它的存数格式。它的每个元素都是一个字符指针,数组的末尾是一个NULL指针

        2. 也是由于argv是一个指针数组,它指向数组的第一个元素(是一个字符指针),所以argv是一个指向字符指针的指针,所以可以将其声明为char **argv。即声明为:【 int main( int argc, char **argv ) 】

        3. 参数名称是不重要的,你可以声明为其它的名字,比如 【 int main( int a, char *b[] ) 】 都是可以的。

        4. 指针数组argv的第 1 个元素,即argv[0],是程序名,也就是你的可执行文件的名字。

        5. 如果你输入的参数中有空格,应该使用双引号括起来。

3.使用举例

        实现一个类似echo命令的程序:将所有参数打印出来。文件名为:my_echo.c

[cpp] view plaincopyprint?
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3.   
  4. /* 实现类似echo的输出一行 */   
  5.   
  6. #define BUFFER_SIZE 100  
  7.   
  8. void function( FILE *input );  
  9.   
  10. int main( int argc, char *argv[]){  
  11.     printf("argc == %d  /n", argc);   
  12.       
  13.     char ** temp = argv;  /* 保留argv */  
  14.     while( *++temp != NULL ){  
  15.         printf("%s ", *temp);  
  16.     }   
  17.     printf("/n");  
  18.       
  19.     system("pause");  
  20.     return EXIT_SUCCESS;  
  21. }  

执行结果:(默认得到的可执行文件为my_echo.ext,在执行函数时,传递参数为hello world, hello C!)。如果在命令行中打开,使用my_echo.exe hello world, hello C!

[cpp] view plaincopyprint?
  1. argc == 5  
  2. hello world, hello C!  

分析:只需要弄清楚指针数组的内部结构,画了张图,见下面。

csdn_命令行参数演示图

原文链接地址:http://blog.csdn.net/daheiantian/archive/2011/02/13/6246519.aspx
0 0
原创粉丝点击