c/c++之:main函数参数

一、文章来由

一直知道但是没有深究的东西。

二、参数解释

说简单点就是:

int argc;//表示读入字符串个数
char *argv[];//指针数组,用来存放读入的字符串

程序的意思逐个输出所有读入的字符串,每个字符串间空一个制表符间隔。

由于main函数不能被其它函数调用,因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢?

实际上,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。

DOS提示符下命令行的一般形式为: C:>可执行文件名 参数 参数…… (也可以选择“开始”菜单“运行”命令:可执行文件名 参数 参数……)

Visual Studio中修改命令行参数:项目—>项目属性—>属性配置—>调试—>命令参数

例如:

#include <iostream>
using namespace std;

int main(int argc,char *argv[],int a,int b)
{

    cout<<argc<<endl;

    while(argc-- > 1)
        printf("%s\n",*++argv);

    cout<<a<<endl;
    cout<<b<<endl;

    return 0;
}

运行结果见图:

最后显示命令行中输入的参数。如果上例的可执行文件名为e24.exe,存放在A驱动器的盘内。因此输入的命令行为:
C:>a:e24 BASIC foxpro FORTRAN
则运行结果为:
BASIC
foxpro
FORTRAN
该行共有4个参数,执行main时,argc的初值即为4。argv的4个元素分为4个字符串的首地址。执行while语句,每循环一次argv值减1,当argv等于1时停止循环,共循环三次,因此共可输出三个参数。在printf函数中,由于打印项*++argv是先加1再打印, 故第一次打印的是argv[1]所指的字符串BASIC。第二、三次循环分别打印后二个字符串。而参数e24是文件名,不必输出。

三、注意

(1)main函数可以不带参数,也可以带参数,这个参数可以认为是main函数的形式参数。C语言规定main函数的有效参数只能有两个(如果是多个,其实是随机值)。

ANSI-C(C89/C99)的话main()函数有2种主要形式。

int main(void)
int main(int argc, char *argv[])

上面第二种,也可写成int main(int argc, char **argv)
argv[argc]放空指针(NULL指针)。
argc和argv可以用别名。

另外,还有一种受系统限制的形式:
int main(int argc, char *argv[], char *envp[])
前两个参数同第二种,第三个参数envp[]放环境变量。
这个形式很少用。

所以严格讲,
ANSI-C 推荐的带参数的 main() 函数只有上面第二种这一种。

(2)C语言还规定argc(第一个形参)必须是整型变量(或者可以隐式强转成int的,比如char也是可以的,但是double不行),argv( 第二个形参)必须是指向字符串的指针数组。

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

C:\>E24  BASIC  foxpro  FORTRAN

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

四、命令行参数转换

// 例如运行:
rec.exe  4  5.2
argc 等于 3, argv[0] 是 "rec.exe", argv[1] 是 "4", argv[2] 是 "5.2".

//主函数里若有:
int x;
float y;
char s[80];

strcpy(s,argv[0]);  // 程序名存入了 s
sscanf(argv[1],"%d",&x);  // x 得到数值4
sscanf(argv[2],"%f",&y);  // y 得到数值 5.2

五、C和C++中常见的几种形式

(1) main()
(2) int main()
(3) int main(void)
(4) int main(int, char**)
(5) int main(int, char*[])
(6) int main(int argc, char **argv)
(7) int main(int argc, char *argv[])
(8) int main( int argc, char *argv[], char*envp[])
(9) void main(void)

(1)是(3)的简写。不推荐使用。
(2)是(3)的简写。在C++中是正确的形式。
(3)在C和C++中都是正确的形式。推荐使用。(还有缺省int的main(void)形式)。
(4)和(5)是不用参数时的一种写法。编译器级别高时会警告。不推荐使用。
(6)是(7)的另外写法。两种都可以,凭个人爱好。
(7)是带参数的正确的形式。推荐使用。
(8)是一种很少用的写法,且受系统限制。
(9)一般不认为是正确的写法。但是在嵌入式系统中有使用(包括void main()形式)


参考资料

[1] http://blog.csdn.net/yhawaii/article/details/7361302
[2] http://www.cnblogs.com/zerocc/archive/2010/12/17/1909642.html

时间: 2024-11-05 08:56:24

c/c++之:main函数参数的相关文章

opencv里main函数参数问题

问题描述 opencv里main函数参数问题 #include ""highgui.h""#include ""stdio.h""int main(int argc char** argv){ IplImage *img = cvLoadImage(argv[1]); cvNamedWindow(""Example1"" CV_WINDOW_AUTOSIZE); cvShowImage(

C++main函数参数怎么传入

问题描述 C++main函数参数怎么传入 int main(int argc,char **argv) { ifstream infile; if (argc < 2 || !open_file(infile,argv[1])) { cerr << "No input file!" << endl; return EXIT_FAILURE; } 这是代码的前几行,执行之后我什么都没做,就输出"No input file!",不知道为啥

C程序中如何调用main函数参数

main函数提供的含参原型如: int _tmain(int argc, _TCHAR* argv[]) { for(int i=0;i<argc;i++)  _tprintf(_T("%s\n"),argv[i]); return 0; } 或者如: int main(int argc, char **argv) { } linux下为: #include "/usr/include/stdio.h" int main(int argc, char **ar

main函数带参数C程序设计模板

/* 一个main含参程序的C语言设计模板,只需在结构体初始化中输入各个参数的性质及内容,就可以自动将参数分拣入结构体中. 命令执行方式如: 程序名 -a 参数1 -b 参数2 程序名 -?[-h] */ #include "stdafx.h" #define MAX_PARA 6 struct parameter { int ID;//参数编号 int content_num;//本参数后带的选项数目 bool IShave_prefix;//暂只接受必须使用-xx之类的参数前缀.

[C/C++基础知识] main函数的参数argc和argv

该篇文章主要是关于C++\C语言最基础的main函数的参数知识,是学习C++或C语言都必备的知识点.不知道你是否知道该知识?希望对大家有所帮助. 一.main()函数参数 通常我们在写主函数时都是void main()或int main() {..return 0;},但ANSI-C(美国国家标准协会,C的第一个标准ANSI发布)在C89/C99中main()函数主要形式为:(1).int main(void) (2).int main(int argc,char *argv[]) = int

main函数的参数(二)

图6-16中,argv[0]是程序名,argv[1]是r1的值,argv[2]是rs的值,argv[3]是屏幕的背景色.由于指针数组均存放字符串,所需的圆半径及背景色彩通过atoi()函数转换为整型.通过带参数的main()函数,我们可以为自己的程序设置口令,在运行程序的命令行中给出所需的口令,正确则继续,否则退出.程序图形输出如图6-17所示. [例6-30]将上述程序作修改,在程序的入口处添置密码,若给定密码正确,则显示图形.#include<graphics.h> #include &l

main函数的参数(一)

C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用时传递.main(){...y1=f1(x1,x2);...}f1(int a,int b){....Y2=f2(x3,x4);....}f2(int m,int n){.........}在前面课程的学习中,对main()函数始终作为主调函数处理,也就是说,允许main()调用其它函数并传递参数.事

c++main函数的命令行参数问题

问题描述 c++main函数的命令行参数问题 int main(int argcchar *argv[]);函数从命令行读取参数1.是不是只有生成了test.exe文件之后才能从命令行读取参数(因为我看见 好多都是在命令行输入test.exe后面再加一些参数这样子的),也就是说 我还在调试阶段就不能从命令行输入参数?2.没有从命令行输入参数的时候,argc=1,*argv[0]是程序的路径的名称,如果main后面的括号里面没有东西,是不是意味着我不能在命令行里运行他,因为找不到路径? 解决方案

编程c语言-CC语言中的main函数中的参数

问题描述 CC语言中的main函数中的参数 就是int argc char *argv[ ] 这个是什么意思,怎么样进行传参的,求大神指点迷津... 解决方案 C编译器允许main()函数没有参数,或者有两个参数(有些实现允许更多的参数,但这只是对标准的扩展).这两个参数,一个是int类型,一个是字符串类型.第一个参数是命令行中的字符串数.按照惯例(但不是必须的),这个int参数被称为argc(argument count).大家或许现在才明白这个形参为什么要取这么个奇怪的名字吧,呵呵!至于英文