首页 文章

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

提问于
浏览
420

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

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

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

int main()

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

8 回答

  • 15

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

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

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

    假设您运行程序(使用 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());
    

    并且你没有得到传递的参数 .

    还有两点需要注意:

    • 这是 main 的唯一两个标准强制签名 . 如果特定平台接受额外的参数或不同的返回类型,那么这是一个扩展,不应该依赖于可移植程序 .

    • *argv[]**argv 完全等效,因此您可以将 int main(int argc, char *argv[]) 写为 int main(int argc, char **argv) .

  • 548

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

  • 2

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

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

    参数 argv 指向字符串数组,称为 argument vector . 它是函数参数的一维字符串数组 .

  • 47

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

  • 8

    两者的

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

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

  • 5

    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
    
  • 5
    int main();
    

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

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

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

    myprogram arg1 arg2 arg3
    

    argc 或Argument Count将设置为4(四个参数), argv 或Argument Vectors将填充字符串指针"myprogram","arg1","arg2"和"arg3" . The program invocation (myprogram) is included in the arguments!

    或者,您可以使用:

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

    这也是有效的 .

    您可以添加另一个参数:

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

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

    VARIABLENAME=VariableValue
    

    像这样:

    SHELL=/bin/bash
    

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

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

相关问题