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
�ho $NUMBER
10
然后你可以在程序中读入这个环境变量。然后根据其值决定一行输出多少个字符。这样,如果你不修改环境变量的话,你每次执行这个程序,一行中显示的字符数都是不一样的
下面是一个例子程序
#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
===========================================================
方法一:projectct->settings->debug->Program Arguments在你的程序名称后面加上你的参数
方法二:在调试过程中修改你的参数值。即设好断点后在WATCH窗口中给你的参数给值。
断点最好设在main(....)函数的{后面。
转自:http://blog.sina.com.cn/s/blog_72aace390100qjx8.html
C/C++语言中的main函数,经常带有参数argc,argv,如下:
int main(int argc, char** argv)
int main(int argc, char* argv[])
这两个参数的作用是什么呢?argc 是指命令行输入参数的个数,argv存储了所有的命令行参数。假如你的程序是hello.exe,如果在命令行运行该程序,运行命令为:
hello.exe Shiqi Yu
那么,argc的值是 3,argv[0]是"hello.exe",argv[1]是"Shiqi",argv[2]是"Yu"。
下面的程序演示argc和argv的使用:
#include int main(int argc, char ** argv)
{ int i; for (i=0; i < argc; i++) printf("Argument %d is %s./n", i, argv[i]); return 0; }
假如上述代码编译为hello.exe,那么运行 hello.exe a b c d e 将得到 Argument 0 is hello.exe.Argument 1 is a.Argument 2 is b.Argument 3 is c.Argument 4 is d.Argument 5 is e.
运行 hello.exe lena.jpg 将得到 Argument 0 is hello.exe.Argument 1 is lena.jpg.
在前面课程的学习中,对main()函数始终作为主调函数处理,也就是说,允许main()调用 其它函数并传递参数。事实上,main()函数既可以是无参函数,也可以是有参的函数。对于有 参的形式来说,就需要向其传递参数。但是其它任何函数均不能调用main()函数。
当然也同样 无法向main()函数传递,只能由程序之外传递而来。这个具体的问题怎样解决呢? 我们先看一下main()函数的带参的形式:
main(argc,argv) int argc,char *argv[]; { ..... } 从函数参数的形式上看,包含一个整型和一个指针数组。当一个C的源程序经过编译、链接后,会生成扩展名为.EXE的可执行文件,这是可以在操作系统下直接运行的文件,换句话说,就是由系统来启动运行的。
对main()函数既然不能由其它函数调用和传递参数,就只能由系统在启动运行时传递参数了。 在操作系统环境下,一条完整的运行命令应包括两部分:命令与相应的参数。其格式为: 命令参数1参数2....参数n 此格式也称为命令行。命令行中的命令就是可执行文件的文件名,其后所跟参数需用空格分隔,并为对命令的进一步补充,也即是传递给main()函数的参数。
命令行与main()函数的参数存在如下的关系: 设命令行为:program str1 str2 str3 str4 str5 其中program为文件名,也就是一个由program.c经编译、链接后生成的可执行文件program.exe,其后各跟5个参数。
对main()函数来说,它的参数argc记录了命令行中命令与参数的个数,共6个,指针数组的大小由参数argc的值决定,即为char*argv[6],指针数组的取值情况如图6-15所示。 数组的各指针分别指向一个字符串。应当引起注意的是接收到的指针数组的各指针是从命令行的开始接收的,首先接收到的是命令,其后才是参数。
下面用实例来说明带参数的main()函数的正确使用。 [例6-29] 利用图形库函数绘制一个变化的环。
它是把一个半径为R 1的圆周分成n份,然 后以每个等分点为圆心,以R s为半径画n个圆(关于作图的详细理论本教材第9章第1节作了专 门介绍,这里只作简单分析)。利用m a i n ( )函数的带参数形式,我们可以从键盘以命令行的方 式输入R 1和R s及屏幕的背景色。
#include /*包含图形库函数的头文件* / #include #define pi 4.1415926
m a i n ( a r g c , a r g v ) int argc;char *argv[]; /* 定义带参数的m a i n ( ) * /
{ int x,y,r1,rs,color; double a; int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"..//bgi ")启;/动*图形工作方式*/ r1=atoi(argv[1]);/*计算基础圆半径*/
rs=atoi(argv[2]);/*计算同心圆半径*/
color=atoi(argv[3]);/*背景色*/
cleardevice();/*清除图形屏幕*/
setbkcolor(color);/*设置背景色*/
setcolor(4);/*设置图形显示颜色*/
for(a=0;a<=2*pi;a+=pi/18)/*绘制同心圆*/
{ x=r1*cos(a)+320; y=r1*sin(a)+240; circle(x,y,rs);/*以圆心坐标为x、y,半径为rs画圆*/
}
getch();/*等待按键继续*/
close graph();/*关闭图形工作方式*/
} 若程序名为L6-29.c,经编译、连结生成可执行文件L6-29.exe。
在操作系统的环境下运行程序,命令行方式为: l6-29 40 20 3 则命令行与main()函数的参数有如图6-16所示的关系。 图6-16中,argv[0]是程序名,argv[1]是r1的值, argv[2]是rs的值,argv[3]是屏幕的背景色。 由于指针数组均存放字符串,所需的圆半径及背景 色彩通过atoi()函数转换为整型。 通过带参数的main()函数,我们可以为自己的程序设置口令,在运行程序的命令行中给出所需的口令,正确则继续,否则退出。程序图形输出如图6-17所示。
[例6-30]将上述程序作修改,在程序的入口处添置密码,若给定密码正确,则显示图 形。
#include
#include
#define pi 4.1415926
m a i n ( a r g c , a r g v )
int argc;char *argv[];
{ int x,y,r1,rs,color; double a;
int gdriver=DETECT,gmode;
if (strcmp(argv[1],"pass")!=0) 设/置* 口令的比较*/
{ printf("password error!/n"); e x i t ( 0 ) ;
}
initgraph(&gdriver,&gmode,"..//bgi ");
r1=atoi(argv[2]);
rs=atoi(argv[3]);
color=atoi(argv[4]);
cleardevice();
setbkcolor(color);
setcolor(4);
for(a=0;a<=2*pi;a+=pi/18)
{ x=r1*cos(a)+320; y=r1*sin(a)+240; circle(x,y,rs); }
getch();
closegraph();
}
在操作系统的环境下运行程序, 命令行中增加口令“p a s s”,命令行方式为: l6-30 pass 20 40 3 指针数组的存储字符串如图6-18所示。 若给定字符串argv[1]的值是pass,则程序正确运行,否则程序退出。口令正确的情况下,显示的图形为图6-17中的一个。