C语言中 int main(int argc,char *argv[])的两个参数及其详细使用

699 阅读3分钟

带参数的int main(int argc, char *argv[])

  • argc: 是命令行总的参数个数;
  • argv[]: 是argc个参数,其中第0个参数是程序的全名,以后的参数。命令行后面跟的用户输入的参数。
int main(int  argc,  char*  argv[]) 
    { 
      int  i; 
      for  (i  =  0;  i<argc;  i++) 
          cout<<argv[i]<<endl; 
      return  0; 
    } 

例如我们输入 ./a.out aaa bbb ccc ddd

则输出结果为

  aaaa 
  bbb 
  ccc 
  ddd

具体含义为: argc = 5,记录了用户在运行程序的命令行中输入的参数的个数。

  • argv[0] = "main"
  • argv[1] = "aaa"
  • argv[2] = "bbb"
  • argv[3] = "ccc"
  • argv[3] = "ddd"

一些应用

代码一:

#include <stdio.h>
#include <string.h>

int main(int argc , int *argv[])
{
    printf("argc = %d\n", argc);

    argv++;
    while (*argv){
        if (strcmp(*argv, "Aa") == 0){
            argv++;
            printf("A for apple\n");

        }else if (strcmp(*argv, "Bb") == 0){
            argv++;
            printf("B for ball\n");

        }else if (strcmp(*argv, "Cc") == 0){
            argv++;
            printf("C for cat\n");

        }else if (strcmp(*argv, "Dd") == 0){
                printf("in d\n");
            argv++;
            printf("D for dog\n");
        }
    }
}

argv是指针,可以通过*argv取值;strcmp是对比;则if (strcmp(*argv, "Aa") == 0)的意思为如果第一个参数为“Aa”,则输出"A for apple",并且通过指针运算argv++指向第二个参数。

代码二:

getopt()用来分析命令行参数。

int getopt(int argc, char * const argv[], const char *optstring);

  • 参数argc 和argv 是由main()传递的参数个数和内容
  • 参数optstring 则代表准备处理的选项字符串

选项,是什么?

在Linux大家运行过这样一条指令gcc -o main main.cpp,其中指令-o是命令行的选项,后面的main-o选项携带的参数。

有些选项是可以不带参数的,例如 ls -l

选项字符串,是什么?

举个例子,"a:b:cd::e",这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。

:又是什么呢? :表示参数,一个:就表示这个选项后面必须带有参数,没有参数就会报错。输入形式 -p80 或者 -p 80,都表示 80 是 -p 的参数。

::两个冒号就表示这个选项的参数是可选的,即可以有参数,也可以没有参数。 需要注意的是两个冒号之间不能有空格。

解析参数

extern char *optarg; 用来保存选项的参数

extern int optind 用来记录下一个检索位置

opterr 是否将错误信息输出到stderr,为0时表示不输出

optopt 保存的是无法识别的选项

#include <stdio.h>
#include <unistd.h>
int main(int argc,char*argv[])
{
    int optch = 0;
	while((optch = getopt(argc, argv, "a:b:cd::e")) != -1)
	{
        // printf("optind: %d\n", optind); //下一个检索位置,即选项的参数位置
		switch (optch)
		{
        case 'a':
            printf("-a %s\n", optarg);
            break;
        case 'b':
            printf("-b %s\n", optarg);
            break;
        case 'C':
        case 'c':
            printf("-c %s\n", optarg);
            break;
        case 'd':
            printf("d:%s\n", optarg);
            break;
        case 'e':
            printf("-e %s\n", optarg);
            break;
        case '?':
        printf("Unknown option: %c\n",(char)optopt);    //表示不在选项字符串optstring中的选项
            break;
        default:
            break;
		}
	}
    // printf("opterr:%d\n",opterr);  //opterr表示是否将错误信息输出到stderr,为0时表示不输出
}

解析

测试程序的选项字符串是a:b:cd::e ,对应的是几个case标签。

  1. a和b有一个 : ,所以a,b选项后面必须携带参数。以下a正常,则b无法识别参数。
# ./main -a test 
-a test 
# ./main -b 
./main: option requires an argument -- 'b' 
Unknown option: b

2. c和e没有 : ,所以 c 选项就类似于 ls -l 中-l一类的选项。

# ./main -c
-c (null)
# ./main -c test
-c (null)

3. d有两个: ,所以d选项的参数是可选的,但是要注意参数与选项之间不能有空格

# ./main -dtest
d:test
# ./main -d test
d:(null)
代码三

判断参数

if (argc < 2) 
{ 
    printf("Usage: %s -w <string>\n", argv[0]); 
    printf(" %s -r\n", argv[0]); 
    return -1; 
}