命令行参数

来源:互联网 发布:php 数组找重复的数据 编辑:程序博客网 时间:2024/04/28 07:45

                                                 


        做为初学者,当我们接触到main函数时,main 后的括号通常都是空括号,即不带参数的main函数。实际上,main函数是可以带参数,这个参数可以认为是main函数的形式参数。

        C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为:
main (argc,argv)
        C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是字符型指针数组。加上形参说明后,main函数的函数头应写为:
main (int argc,char *argv[])

        由于main函数不能被其它函数调用,因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢?
        实际上,main函数的参数值是从操作系统命令行上获得的。由此我们就引入了命令行参数这个概念。



  ------------------------------------------------------------------------------------------------------------------------------------------------------


        接下来,我们就了解一下 【命令行参数】


一、 什么是命令行的参数?
         1.  字面理解:在命令行中给定的参数就是命令行参数。(即从输入位置角度理解)
         2.  在加载主类时,给定的参数。(有main方法的类称为主类,而命令行参数都是送给main方法的,所以也可以说命令行参数是送给main方法的参数)。

二、 命令行的参数由谁来接收?
         1.  一个程序开始于对函数main()的调用。
         2.  在这样做的时候,有两个参数被送给main():
             (1)其中的一个描述了命令行参数的个数,通常称为argc;
             (2)另一个是命令行参数的数组(存放命令行参数的内容),通常称为argv。
        3.  命令行参数都是字符串,所以argv的类型是char* [argc+1]。该程序的名字也作为argv[0]传进来,所以argc的值至少是1。这个参数的表总以0结束,也就是说,argv[argc]==0。


三、 在命令行给定参数时,应注意什么?
        命令行的参数以空格隔开。但是,若命令行的参数本身包含空格时,则该参数必须用一对双引号括起来。


四、 举例剖析

         对命令行参数有了初步的认识后,咱们就来看一个实际应用。以下示例,是我在学习Linux网络编程C/S模式下的一个应用:


[源代码之server.c片段]
int main (int argc, char *argv[])
{
    if (argc != 3)
    {
          printf ("format : %s <ip> <port>\n", argv[0]);
          return -1;
    }

    ......
    ......

    return 0;

}
[源代码之client.c片段]   
int main (int argc, char *argv[])
{
    if (argc != 3)
    {
          printf ("format : %s <server_ip> <server_port>\n", argv[0]);
          return -1;
    }

    ......
    ......

    return 0;

}

[vim编辑器终端命令行-->服务器]  
cuixinhua@cuixinhua-Rev-1-0:~/exec3$ ./server
format : ./server <ip> <port>
cuixinhua@cuixinhua-Rev-1-0:~/exec3$ ./server 192.168.10.162 8888
waiting for clent connection...
[vim编辑器终端命令行-->客户端]
cuixinhua@cuixinhua-Rev-1-0:~/exec3$ ./client
format : ./client <server_ip> <server_port>
cuixinhua@cuixinhua-Rev-1-0:~/exec3$ ./client 192.168.10.162 8888
sockfd = 3
>
[vim编辑器终端命令行-->服务器]
cuixinhua@cuixinhua-Rev-1-0:~/exec3$ ./server
format : ./server <ip> <port>
cuixinhua@cuixinhua-Rev-1-0:~/exec3$ ./server 192.168.10.162 8888
waiting for clent connection...
connect with 192.168.10.162, 39282
waiting for clent connection...


五、 C++中对命令行参数的个数

#include "iostream"
using namespace std;

int main(int argc,char **argv)
{
        cout<<argc<<endl<<argv[argc-1]<<endl;
        return 0;
}



   -----------------------------------------------------------------------------------------------------------------------------------------------------



        讲到这里似乎明白了一些,那么main函数中两个参数具体怎么用呢?让我们来做一个深度的剖析:


一、 命令行参数详解
     
         main(int argc,char **argv)

        1.  main()括号内是固定的写法。
        2.  c语言中命令行参数argc,argv 。
        3.  argc 表示命令行参数的个数,argv表示命令行参数的内容。即是第一个表示参数的个数;第二个参数中argv[0]为自身运行目录路径和程序名,argv[1]指向第一个参数、argv[2]指向第二个参数等等。
        4.  操作系统在调用main函数时是传参数的,main函数的标准原型应该是:int main(int argc, char *argv[]) 。当然,我们也可以做一点小小的改动:
            (1)char **argv :表示main的第2个参数应该为指向字符的指针的指针。
            (2)或者写为 char *argv[] ; 也就是说main的第2个参数应该为一个字符数组指针。
            (3)又或者写为 char argv[][] ;也就是说main的第2个参数应该为一个字符串数组。
       5.  char **argv或者char *argv[]是个二维数组,也可以理解为一个存放字符指针的数组---字符指针数组。每个元素存放一个字符指针,而字符指针又是可以指向一个字符串的,这n个字符串分别由argv[0]~~~argv[n]来指向。
       6.  请注意: 一旦想说明这些参数, 则必须按argc, argv, env 的顺序, 如以下的例子:  
            [1]main()  
            [2]main(int argc)  
            [3]main(int argc, char *argv[])  
            [4]main(int argc, char *argv[], char *env[])  
            tip:其中第二种情况是合法的, 但不常见, 因为在程序中很少有只用argc, 而不用argv[]的情况。
        7.  应该提醒的是: 传送main() 函数的命令行参数的最大长度为128 个字符 (包括参数间的空格), 这是由DOS 限制的。
        8.  main 函数的返回值类型必须是int,这样返回值才能传递给程序的激活者(如操作系统)。

我们先看一下main()函数的带参的形式:

int main(int argc,char *argv[])
{  
        .....
        return 0;
}  

        tip:其中,argc是命令行参数的个数;argv指向一个指针数组的首元素,数组中每个元素都是char *指针,指向整个命令行参数字符串。
 
       9.  C标准也允许int main(void) 这种写法,如果不使用系统传进来的两个参数也可以写成这种形式。


二、 C/C++示例:

        1.  C program:command_line_arguments.c

#include <stdio.h>  
#include <stdlib.h>  

int main(int argc, char *argv[], char *env[])  
{  
    int i;  
    printf("These are the %d command- line arguments passed to main:\n\n", argc);      
    for(i=0; i<=argc; i++)
    {
        printf("argv[%d]:%s\n", i, argv[i]);
    }

    printf("\nThe environment string(s)on this system are:\n\n");      
    for(i=0; env[i]!=NULL; i++)  
    {
        printf(" env[%d]:%s\n", i, env[i]);  //C++ Code: cout<< "argv[" << i <<"]" << argv[i] <<endl;
    }

    return 0;

}  

         2.  C++ program: command_line_arguments.cpp

#include <iostream>
using namespace std;
int main(
    
{
    int count;    
    cout << "\nCommand-line arguments:\n"; // Display each command-line argument.
    for( count = 0; count < argc; count++ )
        cout << "  argv[" << count << "]   "
             << argv[count] << "\n";
}


    小贴士:
[1]int argc: Number of strings in array argv
[2]char *argv[]: Array of command-line argument strings    
[3]char *envp[]: Array of environment variable strings


三、 关于命令行参数的小结

        1.  $提示符下命令行的一般形式为:./可执行文件名 参数 参数……  
        2.  应该特别注意的是,main的两个形参和命令行中的参数在位置上不是一一对应的。因为,main的形参只有二个,而命令行中的参数个数原则上未加限制。
        3.  argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。

            例如:
cuixinhua@cuixinhua-Rev-1-0:~$ ./server 192.168.10.162 8888

            解析:由于可执行文件名./server本身也算一个参数,所以共有3个参数,因此argc取得的值为3。argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。指针数组的长度即为参数个数。数组元素初值由系统自动赋予。

    咱们现在用一个函数来实现显示命令行中输入的参数吧!

int main(int argc,char *argv[])
{  
        while(argc-- > 1)
                printf("%s\n",*++argv);   
        return 0;    
}   

输入的命令行为:
cuixinhua@cuixinhua-Rev-1-0:~$ ./program alpha beta gamma

则运行结果为:
alpha
beta
gamma

        解析:该行共有4个参数,执行main时,argc的初值即为4。argv的4个元素分为4个字符串的首地址。执行while语句,每循环一次argv值减1,当argv等于1时停止循环,共循环三次,因此共可输出三个参数。在printf函数中,由于打印项*++argv是先加1再打印,故第一次打印的是argv[1]所指的字符串alpha。第二、 三次循环分别打印后二个字符串。而参数program是文件名,不必输出。




原创粉丝点击