目录
一、命令行参数
在c语言的入口函数main方法中,可以添加两个参数:argc和argv。通过这两个参数,我们就可以在可执行文件执行的时候将自定义的参数传递到程序中。
看一个例子:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[])
{
printf("argc:%d\r\n", argc);
printf("argv:%s argv1:%s argv2:%s argv3:%s\r\n\r\n", argv[0], argv[1], argv[2], argv[3]);
return 0;
}
- argc:这个参数主要告诉程序有多少个参数,每个参数在命令行上是通过空格分隔开的。
- argv:用于存储命令行参数的字符指针数组。
执行结果:
[admin@localhost ~]$ ./main -p1024 -n10 -c
argc:4
argv:./main argv1:-p1024 argv2:-n10 argv3:-c
二、getopt方法
头文件:
#include<unistd.h>
函数定义:
int getopt(int argc,char * const argv[ ],const char * optstring);
使用了getopt方法后,命令行参数就可以像这样使用短参数模式:./main -p1024 -n10 -c
optstring参数定义规则:
- 如果使用-p1024或者-p 1024这样的短参数方式,则在optstring中需要定义:p:。p为短参数的名称。单个冒号为-p后面会带上参数,参数可以是有空格分隔,也可以不分隔。
- 如果使用-n10这样的短参数方式,其中n和10之间没有空格,则optstring中需要带双冒号:n::
- 如果使用-c这样的短参数方式,并且没有参数,则optstring中直接写这个字母就行了:c
变量:
- char *optarg:参数值
- int optind:argv的索引值,第几个参数。
具体看详细列子:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[])
{
printf("argc:%d\r\n", argc);
printf("argv:%s argv1:%s argv2:%s argv3:%s\r\n\r\n", argv[0], argv[1], argv[2], argv[3]);
int oc;
char ec;
//通过while循环获取
while((oc = getopt(argc, argv, "p:n::c")) != -1)
{
printf("optind:%d\r\n",optind); //参数索引值
printf("optarg:%s\r\n",optarg); //参数值
switch(oc)
{
case 'p': //参数p optarg为参数值,-p 1024或者-p1024使用
printf("Port:%s\n\n", optarg);
break;
case 'n': //参数n 需要-n10 这样使用
printf("Thread Num:%s\n\n", optarg);
break;
case 'c': //参数c,需要-c使用,不用带参数
printf("This is c\n\n");
break;
case '?': //如果设置了未定义的参数,则返回这边的错误信息
ec = (char)optopt;
printf("未定义的参数:%c\r\n", ec);
break;
case ':': //缺少选项
printf("缺少选项参数\r\n");
break;
}
}
return 0;
}
运行命令行:
[admin@localhost ~]$ ./main -p1024 -n10 -c -a
argc:5
argv:./main argv1:-p1024 argv2:-n10 argv3:-c
optind:2
optarg:1024
Port:1024
optind:3
optarg:10
Thread Num:10
optind:4
optarg:(null)
This is c
./main: invalid option -- 'a'
optind:5
optarg:(null)
未定义的参数:a