int argc, char *argv[]是什么意思?

在许多c++ IDE和编译器中,当它为你生成main函数时,它看起来像这样:

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

当我在没有IDE的情况下编写c++代码时,只是使用命令行编译器,我键入:

int main()

没有任何参数。这意味着什么?它对我的程序至关重要吗?

1179154 次浏览

argvargc是在C和c++中命令行参数传递给main()的方式。

argc将是由argv指向的字符串数。这将(在实践中)是1加上参数的数量,因为几乎所有的实现都将程序名放在数组的前面。

根据约定,变量被命名为argc (参数计算)和argv (参数向量),但它们可以被赋予任何有效的标识符:int main(int num_args, char** arg_strings)同样有效。

如果您不打算处理命令行参数,也可以完全省略它们,生成int main()

试试下面的程序:

#include <iostream>


int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}

使用./test a1 b2 c3运行它将输出

Have 4 arguments:
./test
a1
b2
c3

argc是从命令行传递到程序中的参数数量,argv是参数数组。

你可以循环遍历参数,知道它们的数量,像这样:

for(int i = 0; i < argc; i++)
{
// argv[i] is the argument at index i
}

main的参数表示程序启动时提供给程序的命令行参数。argc参数表示命令行参数的数量,char *argv[]是一个字符串数组(字符指针),表示命令行上提供的各个参数。

第一个参数是提供的参数数量,第二个参数是表示这些参数的字符串列表。

这两个

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

是C或c++程序入口点的合法定义。Stroustrup: c++风格和技术常见问题解答详细描述了你的主要函数可能或合法的一些变化。

main函数可以有两个参数,argcargvargc是一个整数(int)参数,它是传递给程序的参数的数量。

程序名始终是第一个参数,因此程序至少有一个参数,argc的最小值为1。但如果程序本身有两个参数,则argc的值将为3。

参数argv指向一个字符串数组,称为参数向量。它是一个一维的函数参数字符串数组。

假设你运行你的程序(使用sh语法):

myprog arg1 arg2 'arg 3'

如果你声明你的main为int main(int argc, char *argv[]),那么(在大多数环境中),你的main()将被调用,就像这样:

p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));

但是,如果将main声明为int main(),则它的名称将类似于

exit(main());

你不能让争论通过。

还有两件事需要注意:

  1. 这是main仅有的两个标准强制签名。如果一个特定的平台接受额外的参数或不同的返回类型,那么这就是一个扩展,在可移植程序中不应该依赖它。
  2. *argv[]**argv完全等价,所以你可以把int main(int argc, char *argv[])写成int main(int argc, char **argv)
int main();

这是一个简单的声明。它不能接受任何命令行参数。

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

当程序必须接受命令行参数时,使用此声明。当像这样运行时:

myprogram arg1 arg2 arg3

argc,或参数计数,将被设置为4(四个参数),argv,或参数向量,将被填充为指向"myprogram", "arg1", "arg2"和"arg3"的字符串指针。# EYZ3

或者,你可以用:

int main(int argc, char** argv);

这也是成立的。

你可以添加另一个参数:

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

envp参数还包含环境变量。每个条目都遵循以下格式:

VARIABLENAME=VariableValue

是这样的:

SHELL=/bin/bash

环境变量列表以空结尾。

不要在调用system()时直接使用任何argvenvp值!这是巨大的安全漏洞,因为恶意用户可以将环境变量设置为命令行命令,并(可能)造成巨大破坏。一般来说,不要使用system()。通过C库实现几乎总是有更好的解决方案。

让我们考虑声明:

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

在上面的声明中,名为argv的第二个参数的类型实际上是char**。也就是说,argv指向char的指针。这是因为char* [] 衰变char**由于型衰变。例如,下面给出的声明是等价的:

int main (int argc, char *argv[]); //first declaration
int main (int argc, char **argv);  //RE-DECLARATION. Equivalent to the above declaration

换句话说,argv是指向元素类型为char*的数组的第一个元素的指针。此外,数组中的每个元素argv[i](类型为char*的元素)本身指向一个字符,该字符是以空字符结尾字符串的开始。也就是说,每个元素argv[i]指向一个元素类型为char(而不是const char)的数组的第一个元素。为了说明目的,给出了一个图表:

argv and argc

正如在其他回答中已经说过的,当我们想要使用命令行参数时,使用这种形式的main声明。

以防你从中学到什么

#include<iostream>
using namespace std;
int main(int argc, char** argv) {
cout << "This program has " << argc << " arguments:" << endl;
for (int i = 0; i < argc; ++i) {
cout << argv[i] << endl;
}
return 0;
}

这个程序有3个参数。然后输出是这样的。

C:\Users\user\Desktop\hello.exe
hello
people

当使用intchar**时,第一个参数将是调用程序的命令数量,第二个参数是所有这些命令

只是补充一下,因为有人说有第三个参数(*envp[]),这是真的,有,但不是POSIX安全的,如果你想让你的程序使用环境变量,你应该使用extern char environ;D