执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。
命令行参数
命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例:
#include<stdio.h>
int main(int argc,char *argv[])
{
printf("Total arg num:%d",argc);
printf("argv[0]:%s",argv[0]);
if(argc>=2)
{
printf("argv[1]:%s",argv[1]);
}
return 0;
}
命令行参数中,char *argv[]也可以用char **argv替代。其中,argv[0]将保存存储函数的名称,argv[1]才是你实际输入的第一个参数。如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,argc 将被设置为 2。
多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 “” 或单引号 ” 内部。
如,若想传递两个参数test1,test2给可执行程序a.out,则输入执行命令为
./a.out test1 test2
而若要传递一个带有空格的参数test1 test2,则应输入
./a.out "test1 test2"
getopt函数
getopt()用来分析命令行参数。函数原型如下:
#include<unistd.h>
int getopt(int argc,char * const argv[],const char * optstring);
//成功,将传入参数赋给全局变量optarg;若参数中没有可识别的选项,返回-1
参数argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的。参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数。
并有以下全局变量:
extern char *optarg;
extern int optind, opterr, optopt;
optarg:指向当前选项参数(如果有)的指针。
optind:再次调用 getopt() 时的下一个 argv 指针的索引。
opterr:这个变量非零时,getopt()函数为“无效选项”和“缺少参数选项,并输出其错误信息。
optopt:最后一个未知选项。
对于optstring中的指定内容,有以下规定:
以getopt(argc, argv, "ab:c:de::");
为例
1)单个字符,表示选项(如下例中的abcde各为一个选项)
2)如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3)单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::,如果没有跟参数,则optarg = NULL)。
4)如果在处理期间遇到了不符合optstring指定的其他选项,getopt()将显示一个错误消息,并将全局变量optarg设为“?”字符,如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。
#include <stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
int ch;
//opterr = 0;//将opterr设置为0,这样就可以在getopt()函数发现错误的时候强制它不输出任何消息。
while((ch = getopt(argc,argv,"a:bcde"))!= -1)
{
switch(ch)
{
case 'a':
{
printf("option a:’%s’\n",optarg);
break;
}
case 'b':
{
printf("option b :b\n");
break;
}
case '?'//当命令行输入参数无效或者没有输入时,且opterr没有设定为0时,会打印以下信息
{
printf("argument error\n");
break;
}
default:
;
}
}
return 0;
}
参考:
http://blog.csdn.net/mr_jj_lian/article/details/6835137
https://baike.baidu.com/item/getopt/4705064?fr=aladdin