一、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(int argc,char **argv)
其中参数 argc 和 argv 用于运行时,把命令行参数传入主程序。
其中 arg 是指 arguments,即参数。具体含义如下:(参考自 Arguments to main 和C++ Primer 7.2.6)
(1) int argc:英文名为 arguments count(参数计数):表示传入 main 函数的参数个数;
count of cmd line args(命令行参数 ),运行程序传送给 main 函数的命令行参数总个数,包括可执行程序名,其中当 argc=1 时表示只有一个程序名称,此时存储在 argv[0] 中。
(2) char **argv:英文名为 arguments value/vector(参数值):表示传入 main 函数的参数序列或指针,并且第一个参数 argv[0] 一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说需要我们输入的 main 函数的参数个数应该是 argc-1 个;
pointer to table of cmd line args(指向命令行参数表的指针),字符串数组,用来存放指向字符串参数的指针数组,每个元素指向一个参数,空格分隔参数,其长度为 argc。数组下标从 0 开始,argv[argc]=NULL 。
argv[0] 指向程序运行时的全路径名
argv[1] 指向程序在 DOS 命令中执行程序名后的第一个字符串
argv[2] 指向执行程序名后的第二个字符串
argv[argc] 为 NULL
二、源代码中的 argc 与 argv
由于 C 程序必须有 main() 函数为入口,而且它不能被其他函数调用(可以调用自身),因此不能再程序内部取得实际值。那么在何处把实参赋值给 main 函数的形参呢?这就需要调用"运行"或"DOS 提示符",在调用可执行程序 exe 时,编译器会帮助我们将输入参数的信息放入 main 函数的参数列表中传参。
我们来创建一个工程来实验一下:
#include<iostream>
using namespace std;
//测试 argc *argv[] 的功能
int main(int argc,char *argv[])
{
for (int i = 0; i < argc; i++)
{
cout << "参数[ " << i << " ]的值为:" << argv[i] << endl;
}
cout << "参数个数为:" << argc << endl;
system("pause");
}
我们运行这个程序时,你会发现它会直接出现下列结果:
我们并没有输入参数,argv[0] 直接默认指向程序运行时的全路径名。
我们这样没法输入参数怎么办?我们可以使用命令提示符窗口来实现,快捷键 win + R 键打开对话框。在弹出的对话框中输入“ cmd ” 即可打开命令提示符窗口:
打开命令提示符窗口后需要输入生成的 exe 文件所在的完整路径,一个简便的方法是把 exe 文件直接拖入提示符窗口即可,之后输入传入参数,以空格分隔,之后回车,显示如下:
最后说明一下:一般编译器默认使用 argc 和 argv 两个名称作为 main 函数的参数,但这两个参数如此命名并不是必须的,你可以使用任何符合 C++ 语言命名规范的变量名作为入参,效果是一样的。