命令行参数

        做为初学者,当我们接触到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是文件名,不必输出。


原帖地址:http://blog.csdn.net/chynna_connie_charlo/article/details/16859975


以上是在做网络编程作业时参考的资料,有关main函数所带形参的详细说明,转帖以备日后查阅,同时附上该次作业的小程序,以作参考


mycat.c

#include <stdio.h>

int main(int argc,char *argv[])
{
	printf(“\n\nThis program is used for showing the command-line arguments inputted and the IP address of the local host!\n”);
	printf(“\nAuthor:Don\nDate:2014-03-23\n\n”);
	
	int I;
printf(“argc=%d\n”,argc);
for(i=0;i<argc;i++)
	{
		printf(“argv[%d]:%s\n”,I,argv[i]);
}
if(strcmp(argv[1],”ip_address”)==0)
	{
		system(“ifconfig eth0”);
		printf(“\n”);
}
		else
			{
				printf(“parameter error\n”);
				printf(“usage:./mycat ip_address\n”);
}
}

以上为第二题作业程序,在该程序中定义了输入参数的个数argc以及用来存储参数名称字符串地址的字符型指针数组*argv[],在打印出当前输入命令行参数的个数和名称之后,使用字符串比较函数strcmp来判断第二个参数的名称是否为ip_address,若是则使用系统调用函数打印出当前主机的IP地址,若不是,则报错并给出正确的使用方法。

使用命令gcc -o mycat mycat.c   命令,在当前目录下生成mycat可执行程序,然后执行命令./mycatip_address命令即可显示当前输入的参数个数和名称,以及当前主机的IP地址。


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值