关于c ++:int argc,char * argv []是什么意思?

What does int argc, char *argv[] mean?

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

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

当我在没有井手的情况下对C++进行编码时,只需使用命令行编译器,就可以输入:

1
int main()

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


EDCOX1 0和EDCOX1 1是如何在C和C++中传递命令行参数到EDCOX1 2。

argcargv指向的字符串数。实际上,这将是1加上参数个数,因为实际上所有的实现都会在数组前面加上程序名。

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

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

尝试以下程序:

1
2
3
4
5
6
7
8
#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运行将输出

1
2
3
4
5
Have 4 arguments:
./test
a1
b2
c3


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

您可以循环使用参数,知道它们的数量,比如:

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


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

1
myprog arg1 arg2 'arg 3'

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

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

但是,如果您将您的主管道声明为int main(),它将被称为

1
exit(main());

你不能让这些论点通过。

另外需要注意的两件事:

  • 这是main的唯一两个标准授权签名。如果一个特定的平台接受额外的参数或不同的返回类型,那么这是一个扩展,不应该在可移植程序中依赖。
  • *argv[]**argv完全相同,所以你可以把int main(int argc, char *argv[])写成int main(int argc, char **argv)

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


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

    程序名始终是第一个参数,因此程序至少有一个参数,argc的最小值为一。但是如果一个程序有两个自变量,那么argc的值将是三个。

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


    1
    int main();

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

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

    当程序必须采用命令行参数时,使用此声明。像这样跑的时候:

    1
    myprogram arg1 arg2 arg3

    argc或参数计数将被设置为4(四个参数),并且argv或参数向量将被填充为指向"myprogram"、"arg1"、"arg2"和"arg3"的字符串指针。程序调用(myprogram包含在参数中!

    或者,您可以使用:

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

    这也是有效的。

    您可以添加另一个参数:

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

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

    1
    VARIABLENAME=VariableValue

    这样地:

    1
    SHELL=/bin/bash

    环境变量列表以空结尾。

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


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


    两个

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

    是C或C++程序入口点的法律定义。Stroustrup:C++风格和技术FAQ详细描述了一些可能的或合法的对你的主要功能的变化。