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模式下的一个应用:
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(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.youkuaiyun.com/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地址。