执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。

    main 的两个参数的参数名如下:

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

    并不一定这样写,只是约定俗成罢了。但是亦可以写成下面这样:

    1. int main( int test_argc, char *test_argv[] )

    命令行参数是使用 main() 函数参数来处理的,其中,argc是指传入参数的个数,argv[]是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例,检查命令行是否有提供参数,并根据参数执行相应的动作:

    1. #include <stdio.h>
    2. int main(int argc, char *argv[])
    3. {
    4. if (argc == 2)
    5. {
    6. printf("The argument supplied is %s\n", argv[1]);
    7. }
    8. else if (argc > 2)
    9. {
    10. printf("Too many arguments supplied.\n");
    11. }
    12. else
    13. {
    14. printf("One argument expected. %s\n", argv[0]);
    15. }
    16. }

    使用一个参数,编译并执行上面的代码,它会产生下列结果:

    1. $./a.out testing
    2. The argument supplied is testing

    使用两个参数,编译并执行上面的代码,它会产生下列结果:

    1. $./a.out testing1 testing2
    2. Too many arguments supplied.

    不传任何参数,编译并执行上面的代码,它会产生下列结果:

    1. $./a.out
    2. One argument expected. /Users/ken/Desktop/test/test

    应当指出的是,

    • argv[0] 存储程序的名称
    • argv[1] 是一个指向第一个命令行参数的指针
    • *argv[n] 是最后一个参数。
    • 如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,argc将被设置为 2。

    多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 “” 或单引号 ‘’ 内部。让我们重新编写上面的实例,有一个空间,那么你可以通过这样的观点,把它们放在双引号或单引号””””。让我们重新编写上面的实例,向程序传递一个放置在双引号内部的命令行参数:

    1. #include <stdio.h>
    2. int main( int argc, char *argv[] )
    3. {
    4. printf("Program name %s\n", argv[0]);
    5. if( argc == 2 )
    6. {
    7. printf("The argument supplied is %s\n", argv[1]);
    8. }
    9. else if( argc > 2 )
    10. {
    11. printf("Too many arguments supplied.\n");
    12. }
    13. else
    14. {
    15. printf("One argument expected.\n");
    16. }
    17. }

    使用一个用空格分隔的简单参数,参数括在双引号中,编译并执行上面的代码,它会产生下列结果:

    1. $./a.out "testing1 testing2"
    2. Progranm name ./a.out
    3. The argument supplied is testing1 testing2

    Linux 下我们可使用 getoptgetopt_long 来对命令行参数进行解析,例如:

    1. int main(int argc, char *argv[]){
    2. char *optstr = "p:n:m:c:";
    3. struct option opts[] = {
    4. {"path", 1, NULL, 'p'},
    5. {"name", 1, NULL, 'n'},
    6. {"mtime", 1, NULL, 'm'},
    7. {"ctime", 1, NULL, 'c'},
    8. {0, 0, 0, 0},
    9. };
    10. int opt;
    11. while((opt = getopt_long(argc, argv, optstr, opts, NULL)) != -1){
    12. switch(opt) {
    13. case 'p':
    14. strcpy(path, optarg);
    15. break;
    16. case 'n':
    17. strcpy(targetname, optarg);
    18. break;
    19. case 'm':
    20. modifiedtime = atoi(optarg);
    21. break;
    22. case 'c':
    23. changetime = atoi(optarg);
    24. break;
    25. case '?':
    26. if(strchr(optstr, optopt) == NULL){
    27. fprintf(stderr, "unknown option '-%c'\n", optopt);
    28. }else{
    29. fprintf(stderr, "option requires an argument '-%c'\n", optopt);
    30. }
    31. return 1;
    32. }
    33. }
    34. findInDir(path);
    35. return 0;
    36. }