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

时间:2010-06-11 15:45:43

标签: c++ parameters command-line-arguments argv argc

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

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

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

int main()

没有任何参数。这意味着什么,这对我的计划至关重要吗?

8 个答案:

答案 0 :(得分:588)

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

答案 1 :(得分:49)

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

你可以通过参数循环知道它们的数量,如:

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

答案 2 :(得分:17)

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

myprog arg1 arg2 'arg 3'

如果您将自己的主要声明为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)

答案 3 :(得分:8)

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

答案 4 :(得分:5)

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

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

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

答案 5 :(得分:4)

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

答案 6 :(得分:4)

int main();

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

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

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

myprogram arg1 arg2 arg3

argc或Argument Count将设置为4(四个参数),argv或Argument Vectors将填充字符串指针“myprogram”,“arg1”,“ arg2“和”arg3“。 程序调用(myprogram)包含在参数中!

或者,您可以使用:

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

这也是有效的。

您可以添加另一个参数:

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

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

VARIABLENAME=VariableValue
像这样:

SHELL=/bin/bash    

环境变量列表以空值终止。

重要提示:在argv的通话中,请勿直接使用任何envpsystem()值!这是一个巨大的安全漏洞,因为恶意用户可以将环境变量设置为命令行命令并(可能)造成大量破坏。一般来说,只是不要使用system()。通过C库几乎总能有更好的解决方案。

答案 7 :(得分:1)

两者

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

是C或C ++程序入口点的合法定义。 Stroustrup: C++ Style and Technique FAQ详细说明了您的主要功能可能或合法的一些变体。