linux学习之命令参数解析——getopt()函数

Linux命令行参数解析函数——getopt()

=============================================================================
    最近在做应用程序的时候常常会用到命令行参数,如cmd -a -b xx,getopt函数的功能就是实现命令行参数解析。

表头文件 #include<unistd.h>

getopt( )函数的声明:
int getopt(int argc,char * const argv[ ],const char * optstring);//定义函数
extern char *optarg;
extern int optind, opterr, optopt;

getopt() 所设置的全局变量包括:
optarg——指向当前选项参数(如果有)的指针。
optind——再次调用 getopt() 时的下一个 argv 指针的索引。
optopt——最后一个未知选项。
optstring中的指定的内容的意义,如getopt(argc, argv, "ab:c:de::");
     1.单个字符,表示选项,(如上例中的abcde各为一个选项)
     2.单个字符后接一个冒号:表示该选项后必须跟一个参数,参数紧跟在选项后或者以空格隔开,该参数的指针赋给optarg。(如上例中的b:c:)
     3 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::,如果没有跟参数,则optarg = NULL)

=============================================================================

下面是我自己的做的一个小的程序为例:
-a  打印我的选择
-b 打印我的选择以及自己输入的信息
-c 打印我的选择以及自己输入的信息
      命令的输入难免会有错误,
如果不希望输出任何错误信息,或更希望输出自定义的错误信息。可以采用以下两种方法来更改getopt()函数的出错信息输出行为:
  1. 在调用getopt()之前,将opterr设置为0,这样就可以在getopt()函数发现错误的时候强制它不输出任何消息。
  2. 如果optstring参数的第一个字符是冒号,那么getopt()函数就会保持沉默,并根据错误情况返回不同字符,如下:
        “无效选项” —— getopt()返回'?',并且optopt包含了无效选项字符(这是正常的行为)
        “缺少选项参数” —— getopt()返回':',如果optstring的第一个字符不是冒号,那么getopt()返回'?',这会使得这种情                况不能与无效选项的情况区分开
#include <stdio.h>
#include <unistd.h>
/********************************************************************************
 *  Description:
 *   Input Args:
 *  Output Args:
 * Return Value:
 ********************************************************************************/
int main (int argc, char **argv)
{
    int opt;
    char ec;
    if(argc<2)
    {
        printf("please input more!\n");
    }
    while((opt=getopt(argc,argv,":ab:c:"))!=-1)
    {
        switch(opt)
        {
            case 'a':
                printf("my choice is a!\n");
                break;
            case 'b':
                printf("my choice is b!\n");
                printf("input is %s!\n",optarg);
                break;
            case 'c':
                printf("my choice is c!\n");
                printf("input is %s!\n",optarg);
            case '?':
                ec=(char)optopt;
                printf("无效的参数:%c!\n",ec);
                break;
            case ':':
                printf("缺少字符!\n");
        }
    }
    return 0;
} /* ----- End of main() ----- */

下面是测试的结果:

[wwl@centos6 eeprom]$ ./test -a
my choice is a!
[wwl@centos6 eeprom]$ ./test -b abc
my choice is b!
input is abc!
[wwl@centos6 eeprom]$ ./test -c lmn
my choice is c!
input is lmn!
[wwl@centos6 eeprom]$ ./test -b
缺少字符!
[wwl@centos6 eeprom]$ ./test -l
无效的参数:l!









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值