首页 文章

关于'main(int argc, char *argv[])' [重复]

提问于
浏览
77

可能重复:main()的参数是什么? int argc,char * argv []是什么意思?

每个程序都以 main(int argc, char *argv[]) 定义开头 .

我不是在程序中使用它们吗?为什么不呢: int main()

该程序的名称 *argv[]argc 的元素之一是 *argv[] 中参数数量的计数?发送到 *argv[] 的其他参数是什么?我们如何发送它们?

8 回答

  • 14

    您可以使用 app -something -somethingelse 等参数运行应用程序 . int argc 表示这些参数的数量, char *argv[] 是一个将实际参数传递到应用程序的数组 . 这样您就可以在应用程序内部使用它们 .

  • 1

    main 的参数 argcargv 被用作向程序发送参数的一种方式,可能最熟悉的方法是使用用户可以键入cat文件的良好终端 . 这里的单词 cat 是一个程序,它接收一个文件并将其输出到标准输出( stdout ) .

    程序接收 argc 中的参数个数和 argv 中的参数向量,上面的 arg ument c ount将为2(程序名称计为第一个参数), arg ument v ector将包含[ catfile ,空值] . 而最后一个元素是一个空指针 .

    通常,你会这样写:

    int  // Specifies that type of variable the function returns.
         // main() must return an integer
    main ( int argc, char **argv ) {
         // code
         return 0; // Indicates that everything went well.
    }
    

    如果您的程序不需要任何参数,则以下列方式编写 main 函数同样有效:

    int main() {
      // code
      return 0; // Zero indicates success, while any 
      // Non-Zero value indicates a failure/error
    }
    

    在C语言的早期版本中, main 之前没有 int ,因为这是隐含的 . 今天,这被认为是一个错误 .

    在符合 POSIX 的系统(和Windows)上,可以使用第三个参数 char **envp ,其中包含程序environment variables的向量 . 存在 main 函数的参数列表的进一步变体,但由于它是非标准的,因此我不会在此详细说明 .

    此外,变量的命名是一种惯例,没有实际意义 . 坚持这一点总是一个好主意,这样你就不会混淆他人,但将 main 定义为同样有效 .

    int main(int c, char **v, char **e) {
       // code
       return 0;
    }
    

    对于第二个问题,有几种方法可以将参数发送给程序 . 我建议你看exec*()family of functions这是 POSIX -standard,但是 easier 可能只是 easier ,但 system() 的使用通常不赞成,因为它不能保证在每个系统上都能正常工作 . 我自己没有测试过;但如果* NIX系统上没有安装 bashzsh 或其他shell, system() 将失败 .

  • 0

    这些用于在调用程序时将参数传递给程序,例如从命令行传递

    $ gcc mysort.c -o mysort
    
    $ mysort 2 8 9 1 4 5
    

    上面,程序 mysort 使用一些命令行参数执行 . 在 main( int argc, char * argv[]) 里面,这会导致

    Argument Count, argc = 7
    

    因为有7个参数(计算程序),和

    Argument Vector, argv[] = { "mysort", "2", "8", "9", "1", "4", "5" };
    

    以下是一个完整的例子 .

    $ cat mysort.c
    #include <stdio.h>
    int main( int argc, char * argv [] ) {
        printf( "argc = %d\n", argc );
        for( int i = 0; i < argc; ++i ) {
            printf( "argv[ %d ] = %s\n", i, argv[ i ] );
        }
    }
    
    $ gcc mysort.c -o mysort
    
    $ ./mysort 2 8 9 1 4 5
    argc = 7
    argv[ 0 ] = ./mysort
    argv[ 1 ] = 2
    argv[ 2 ] = 8
    argv[ 3 ] = 9
    argv[ 4 ] = 1
    argv[ 5 ] = 4
    argv[ 6 ] = 5
    

    [ char 字符串"2","8"等可以使用某些字符到数字转换功能转换为数字,例如 atol() (link)]

  • 1

    使用 argc (参数计数)和 argv (参数向量),可以在启动应用程序时获取传递参数的数量和值 .

    这样,您可以在启动应用程序时以不同的方式使用参数(例如 -version ) .

    但你也可以使用 int main(void) 作为C的原型 .

    还有第三个(不太知名的和非标准的)原型,第三个参数是 envp . 它包含环境变量 .


    Resources:

  • 51

    argc 表示传递给程序的参数个数 . char* argv[] 是传递的参数 . argv[0] 始终是程序名称本身 . 我不是100%肯定,但我认为 int main() 在C / C中有效 .

  • 3

    argc 是在运行时为程序提供的命令行参数的数量, argv 是包含这些参数的字符数组(而不是C字符串数组)的数组 . 如果您知道自己不需要命令行参数,则可以声明主要参与 void 参数,而不是:

    int main(void) {
        /* ... */ 
    }
    

    根据标准,这是为 main 定义的唯一两个原型,但是一些编译器也允许返回类型 void . 更多关于这个on Wikipedia .

  • 0

    comp.lang.c FAQ处理这个问题

    "What's the correct declaration of main()?"
    

    in Question 11.12a .

  • 98

    argc 是命令行参数的数量, argv 是表示的字符串数组命令行参数 .

    这使您可以选择对传递给程序的参数作出反应 . 如果你没有期待,你也可以使用 int main .

相关问题