首页 > 代码库 > 关于int main(int argc,char* argv[])详解

关于int main(int argc,char* argv[])详解

平时在VS的环境下,主函数总会看到这两个参数,今天突然很想知道这两个参数的原理以及作用,因此查了下资料。真心受教了。

下面的博文是在百度空间看一位大神的,原文链接:http://hi.baidu.com/sgglong70626/item/8881322b2dce21c1ee10f11e

argc是命令行总的参数个数   
argv[]为保存命令行参数的字符串指针,其中第0个参数是程序的全名,以后的参数为命令行后面跟的用户输入的参数,argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数argc。数组元素初值由系统自动赋予。比如:   
int   main(int   argc,   char*   argv[])   
{   
int   i;   
for   (i   =   0;   i<argc;   i++)   
cout<<argv[i]<<endl;   
cin>>i;   
return   0;   
}   
执行时敲入   
F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE   aaaa   bbb   ccc   ddd   
输出如下:   
F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE   
aaaa   
bbb   
ccc   
ddd   
--------------------------------------------------------------------
char   *argv[]是一个字符数组,其大小是int   argc,主要用于命令行参数   argv[]   参数,数组里每个元素代表一个参数;
比如你输入   
test   a.c   b.c   t.c   
则   
argc   =   4   

argv[0]   =   "test"   
argv[1]   =   "a.c"   
argv[2]   =   "b.c"   
argv[3]   =   "t.c"
--------------------------------------------------------------------------------------------  
argc记录了用户在运行程序的命令行中输入的参数的个数。   
arg[]指向的数组中至少有一个字符指针,即arg[0].他通常指向程序中的可执行文件的文件名。在有些版本的编译器中还包括程序
文件所在的路径。
-------------------------------------------------------------------------
在调用一个可执行程序时,某些情况下需要向程序传递参数。如我们可以在控制台中键入notepad.exe,
回车后将执行记事本程序。如果我们希望在打开notepad时同时打开一个文本文件,可以在notepad.exe  
后面跟上文件的路径和名字,如notepad.exe   example.txt(文件在当前路径)。   

那么程序中如何能得到这些输入参数呢?这个工作是编译器帮我们完成的,编译器将输入参数的信息
放入main函数的参数列表中。   

main函数的参数列表保存了输入参数的信息,第一个参数argc记录了输入参数的个数,   
第二个参数是字符串数组的,字符串数组的每个单元是char*类型的,指向一个c风格字符串。   
以notepad.exe   example.txt为例   
argc是2,就是说argv数组中有两个有效单元   
第一单元指向的字符串是"notepad.exe"   
第二单元指向的字符串是"example.txt"   

argv数组中的第一个单元指向的字符串总是可执行程序的名字,以后的单元指向的字符串依次是程序调用时的参数。   

这个赋值过程是编译器完成的,我们只需要读出数据就可以了。
-----------------------------------------------------------------------------

int     main(   int   argc   ,   char   *argv[]   ,   char   *envp[]   )   
main()函数一般用int或者void形的。我比较喜欢用int型定义main。因为在结束的时候可以返回给操作系统一个值以表示执行情况。   

int   argc   
这个东东用来表示你在命令行下输入命令的时候,一共有多少个参数。比方说你的程序编译后,可执行文件是test.exe   
D:\tc2>test   
这个时候,argc的值是1   
但是   
D:\tc2>test.exe   myarg1   myarg2   
的话,argc的值是3。也就是   命令名   加上两个参数,一共三个参数   

char   *argv[]   
这个东东用来取得你所输入的参数   
D:\tc2>test   
这个时候,argc的值是1,argv[0]的值是   "test"   
D:\tc2>test   myarg1   myarg2   
这个时候,argc的值是3,argc[0]的值是"test",argc[1]的值是"myarg1",argc[2]的值是"myarg2"。   
这个东东一般用来为程序提供非常重要的信息,如:数据文件名,等等。   
如:copy   a.c   b.txt   
这个时候,a.c和b.txt就是所谓的“非常重要的信息”。不指定这两个文件,你没法进行拷贝。   
当你的程序用到argc和argv这两个参数的时候,可以简单地通过判断argc的值,来看看程序的参数是否符合要求   

char   *envp[]   
这个东东相对来说用得比较少。它是用来取得系统的环境变量的。   
如:在DOS下,有一个PATH变量。当你在DOS提示符下输入一个命令(当然,这个命令不是dir一类的内部命令)的时候,DOS会首先在当前目录下找 这个命令的执行文件。如果找不到,则到PATH定义的路径下去找,找到则执行,找不到返回Bad   command   or   file   name   
在DOS命令提示符下键入set可查看系统的环境变量   
同样,在UNIX或者LINUX下,也有系统环境变量,而且用得比DOS要多。如常用的$PATH,$USER,$HOME等等。   
envp保存所有的环境变量。其格式为(UNIX下)   
PATH=/usr/bin;/local/bin;   
HOME=/home/shuui   
即:   
环境变量名=值   
DOS下大概也一样。   
环境变量一般用来为程序提供附加信息。如,你做了一个显示文本的内容的程序。你想控制其一行中显示的字符的个数。你可以自己定义一个环境变量(UNIX下)   
%setenv   NUMBER   =   10   
%echo   $NUMBER   
10   
然后你可以在程序中读入这个环境变量。然后根据其值决定一行输出多少个字符。这样,如果你不修改环境变量的话,你每次执行这个程序,一行中显示的字符数都是不一样的   
下面是一个例子程序   

/* argtest.c */   
#include<stdio.h>   
int main(   int   argc   ,   char   *argv[]   ,   char   *envp[]   )   
{   
int   i;   

printf(   "You   have   inputed   total   %d   argments\n"   ,   argc   );   
for(   i=0   ;   i<argc   ;   i++)   
{   
printf(   "arg%d   :   %s\n"   ,   i   ,   argv[i]   );   
}   

printf(   "The   follow   is   envp   :\n"   );   
for(   i=0   ;   *envp[i]!=‘\0‘   ;   i++   )   
{   
printf(   "%s\n"   ,   envp[i]   );   
}   
return   0;   
}   


D:\>argtest   this   is   a   test   programe   of   main()‘s   argments   
You   have   inputed   total   9   argments   
arg0   :   D:\TC\NONAME.EXE   
arg1   :   this   
arg2   :   is   
arg3   :   a   
arg4   :   test   
arg5   :   programe   
arg6   :   of   
arg7   :   main()‘s   
arg8   :   argments   
The   follow   is   envp   :   
TMP=C:\WINDOWS\TEMP   
TEMP=C:\WINDOWS\TEMP   
PROMPT=$p$g   
winbootdir=C:\WINDOWS   
PATH=C:\WINDOWS;C:\WINDOWS\COMMAND   
COMSPEC=C:\WINDOWS\COMMAND.COM   
SBPCI=C:\SBPCI   
windir=C:\WINDOWS   
BLASTER=A220   I7   D1   H7   P330   T6   
CMDLINE=noname   this   is   a   test   programe   of   main()‘s   argments     
-----------------------------------------------------------------------------------------
命令行参数啊。argc   是参数的个数,argv[]是参数,argv[0]是文件名,argv[1]是第一个参数...   
如你得exe文件名是:myprog.exe,那么   
myprog   12   22   32   
则argv[0]="myprog",argv[1]="12",argv[2]="22"...   

exit()是程序退出时的返回码。可以用其他程序接收,判断是否正常退出。如exit(-1)认为异常退出。
---------------------------------------------------------------------------------------------

请问这里为什么要设置这两个参数呢?不要不行吗?谢谢
有些时候程序运行时需要提供一些参数。比如copy命令,需要指明源文件和目标文件名,就得通过argc和argv来传递

 

1、int main(int argc,char *argv)与int main(int argc,char **argv)区别?

     

int main(int argc,char *argv)

  argc: 整数,用来统计你运行程序时送给的命令行参数的个数

  * argv: 字符串,用来存放指向你的字符串参数的,每一个元素指向一个参数

  argv[0] 指向程序运行的全路径名

  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串

  argv[2] 指向执行程序名后的第二个字符串

     

  int main(int argc,char **argv) 相当于  int main(int argc,char *argv[ ] )

     argc: 整数,用来统计你运行程序时送给的命令行参数的个数

  * argv: 字符串,用来存放指向你的字符串参数的,每一个元素指向一个参数

  argv[1] 指向在DOS命令行中执行程序名后的第一个字符串的指针

  argv[2] 指向执行程序名后的第二个字符串的指针

      在int main(int argc,char **argv)中 argv[1]是一个指针,存的内容是一个地址,而在int main(int argc,char

       *argv)中argv[1]是一个数组元素(个人理解)

 我们经常用的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:  
main (argc,argv)
int argv;
char *argv[];或写成:
main (int argc,char *argv[])
  由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢? 实际上,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。

  DOS提示符下命令行的一般形式为: C:\>可执行文件名 参数 参数……; 但是应该特别注意的是,main 的两个形参和命令行中的参数在
位置上不是一一对应的。因为,main的形参只有二个,而命令行中的参数个数原则上未加限制。argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。例如有命令行为: C:\>E6 24 BASIC dbase FORTRAN由于文件名E6 24本身也算一个参数,所以共有4个参数,因此argc取得的值为4。argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数。数组元素初值由系统自动赋予。其表示如图6.8所示:
main(int argc,char *argv){
while(argc-->1)
printf("%s\n",*++argv);
}
本例是显示命令行中输入的参数如果上例的可执行文件名为e24.exe,存放在A驱动器的盘内。
因此输入的命令行为: C:\>a:e24 BASIC dBASE FORTRAN  
则运行结果为:
BASIC
dBASE
FORTRAN
  该行共有4个参数,执行main时,argc的初值即为4。argv的4个元素分为4个字符串的首地址。执行while语句,每循环一次 argv值减1,当argv等于1时停止循环,共循环三次, 因此共可输出三个参数。在printf函数中,由于打印项*++argv是先加1再打印, 故第一次打印的是argv[1]所指的字符串BASIC。第二、 三次循环分别打印后二个字符串。而参数e24是文件名,不必输出。

  下例的命令行中有两个参数,第二个参数20即为输入的n值。在程序中*++argv的值为字符串“20”,然后用函数"atoi"把它换为整型作为while语句中的循环控制变量,输出20个偶数。
#include"stdlib.h"
main(int argc,char*argv[]){
int a=0,n;
n=atoi(*++argv);
while(n--) printf("%d ",a++*2);
}
  本程序是从0开始输出n个偶数。指向指针的指针变量如果一个指针变量存放的又是另一个指针变量的地址, 则称这个指针变量为指向指针的指针变量。

  在前面已经介绍过,通过指针访问变量称为间接访问, 简称间访。由于指针变量直接指向变量,所以称为单级间访。 而如果通过指向指针的指针变量来访问变量则构成了二级或多级间访。在C语言程序中,对间访的级数并未明确限制, 但是间访级数太多时不容易理解解,也容易出错,因此,一般很少超过二级间访。 指向指针的指针变量说明的一般形式为:  
类型说明符** 指针变量名;  
例如: int ** pp; 表示pp是一个指针变量,它指向另一个指针变量, 而这个指针变量指向一个整型量。下面举一个例子来说明这种关系。
main(){
int x,*p,**pp;
x=10;
p=&x;
pp=&p;
printf("x=%d\n",**pp);
}  
  上例程序中p 是一个指针变量,指向整型量x;pp也是一个指针变量, 它指向指针变量p。通过pp变量访问x的写法是**pp。程序最后输出x的值为10。通过上例,读者可以学习指向指针的指针变量的说明和使用方法。

  下述程序中首先定义说明了指针数组ps并作了初始化赋值。 又说明了pps是一个指向指针的指针变量。在5次循环中, pps 分别取得了ps[0],ps[1],ps[2],ps[3],ps[4]的地址值(如图6.10所示)。再通过这些地址即可找到该字符串。
main(){
static char *ps[]={ "BASIC","DBASE","C","FORTRAN",
"PASCAL"};
char **pps;
int i;
for(i=0;i<5;i++){
pps=ps+i;
printf("%s\n",*pps);
}
}
本程序是用指向指针的指针变量编程,输出多个字符串。