Unix/Linux程序设计之getopt函数浅谈

Linux中getopt函数用法:
    1、函数作用:

getop函数用于解析命令行参数的以'-'或者‘--'开头的参数选项,除去'-'或者'--'选项元素
    如果被重复调用,则它将会依次返回每个选项元素中选项字符。
    2、函数原型:

       #include <unistd.h>
    int getopt(int argc, char * const argv[],
                  const char *optstring);
    extern char *optarg;
    extern int optind, opterr, optopt;

其中几个全局变量的含义:
              extern char *optarg:保存必须接参数的选型元素的参数,
        extern int optind:指示下一个要解析的参数位置,初始值为1,
        extern int opterr:设置为0将不打印错误信息。
        extern int optopt:当发现无效选项字符之时,getopt()函数或返回'?'字符,或返回':'字符,并且optopt包含了所发现的无效选项字符。
    3、函数参数解析:
            a、int argc, char * const argv[],分别存放main函数的参数,
            b、char *optstring需要解析的参数
                1. 单个字符,表示选项,这里一共有t、d、c、h、q五个选项
                2. 单个字符后接一个冒号“:”表示该选项后必须跟一个参数,参数紧跟在选项后或者以空格隔开
                3. 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟,如果后边跟一个参数,参数必须紧跟在选项后不能以空格隔开
                4、如果optstring参数的第一个字符是冒号,那么getopt()函数就会保持沉默,并根据错误情况返回不同字符,如下:
            “无效选项” —— getopt()返回'?',并且optopt包含了无效选项字符(这是正常的行为)。
            “缺少选项参数” —— getopt()返回':',如果optstring的第一个字符不是冒号,那么getopt()返回'?',这会使得这种情况不能与无效选项的情况区分开。
    4、返回值:
        如果当前处理的参数为选项参数,且该选项字符串optstring字符串中,即为定义的选项,则返回该选项字符。
        如果当前处理的参数不是选项参数,则optind偏移向下一个参数,直到找到第一个选项参数为止,然后再按之前的描述操作,如果找不到选项参数,说明解析结束,则返回-1
        
    5、测试用例:
        1、最基本用法:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>

int main(int argc,char *argv[])
{
        int oc;          //选项字符
        char *b_opt_arg;        //选项参数字符串
        while((oc = getopt(argc,argv,"ngl:")) != -1)
        {
                switch(oc)
                {
                        case 'n':
                                printf("My name is fengkai\n");
                                break;
                        case 'g':
                                printf("Her name is zhanghaun\n");
                                break;
                        case 'l':
                                b_opt_arg = optarg;
                                printf("Our love is %s\n",b_opt_arg);
                                break;
                }
        }
        return 0;
}

2、加上“:”后接参数的情况:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
int main(int argc,char *argv[])
{
        int oc;          //选项字符
        char *b_opt_arg;        //选项参数字符串
        while((oc = getopt(argc,argv,"ngl:")) != -1)
        {
                switch(oc)
                {
                        case 'n':
                                printf("My name is fengkai\n");
                                break;
                        case 'g':
                                printf("Her name is zhanghaun\n");
                                break;
                        case 'l':
                                b_opt_arg = optarg;
                                printf("Our love is %s\n",b_opt_arg);
                                break;
                        case '?':
                                printf("arguement error\n");
                                break;
                }
        }
        return 0;
}

3、参数开始加上":"根据出错情况返回:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
int main(int argc,char *argv[])
{
        int oc;          //选项字符
        char ec;     //无效的选项字符
        char *b_opt_arg;        //选项参数字符串
        while((oc = getopt(argc,argv,":ngl:")) != -1)
        {
                switch(oc)
                {
                        case 'n':
                                printf("My name is fengkai\n");
                                break;
                        case 'g':
                                printf("Her name is zhanghaun\n");
                                break;
                        case 'l':
                                b_opt_arg = optarg;
                                printf("Our love is %s\n",b_opt_arg);
                                break;
                        case '?':
                                printf("arguement error\n");
                                break;
                        case ':':
                                printf("缺少选项参数!\n");
                                break;
                }
        }
        return 0;
}
时间: 2024-08-03 07:33:52

Unix/Linux程序设计之getopt函数浅谈的相关文章

Linux的文本处理工具浅谈-awk sed grep

Linux的文本处理工具浅谈 awk   老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS竖着切,列的分隔符 RS横着切,行的分隔符 [语法格式] awk [–F] [“[分隔符]”] [’{print$1,$NF}’] [目标文件] awk 'BEGIN{FS="[列分隔符]+";RS="[行分隔符]+";print "-GEGIN-"

Linux系统/dev/mapper目录浅谈

Linux系统的一般的文件系统名称类似于/dev/sda1或/dev/hda1,但是今天在进行系统维护的时候,利用df -h 命令敲出了/dev/mapper/VolGroup-lv_root和/dev/mapper/Volume-lv_home两个文件系统名,不解,在网上查找资料后,在此浅谈/dev/mapper目录. 一.理解Linux系统的Device mapper机制 Device mapper是Linux2.6内核中提供的一种从逻辑设备到物理设备的映射机制,在该机制下,用户能够很方便的

Linux新手必看:浅谈如何学习linux

本文在Creative Commons许可证下发布 一.起步 首先,应该为自己创造一个学习linux的环境--在电脑上装一个linux或unix问题1:版本的选择 北美用redhat,欧洲用SuSE,桌面mandrake较多,而debian是技术最先进的,linux开发人员中用debian的最多,其次是redhat,从全球linux各应用领域市场份额来看无疑redhat是最多的,此外还有很多出名的发行版本,不再列举.原则是:我们没有必要把时间浪费在"装系统"上而应集中精力学习最有用的东

Linux基础(5)Linux的用户,组管理以及Linux的下的权限浅谈

Linux下的权限管理与用户跟组的概念是分不开的.简单来说,Linux下的文件有三种权限r w x 对于文件来说 r:可读,可以使用类似cat等命令查看文件内容: w:可写,可以编辑或删除此文件: x: 可执行,eXacutable,可以命令提示符下当作命令提交给内核运行: 对于目录来说: r: 可以对此目录执行ls以列出内部的所有文件 w: 可以在此目录创建文件: x: 可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息: 对于文件或者目录来说,权限按照文件的所有者可以划分为

Javascript-回调函数浅谈

回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 中文名 回调函数 外文名 Callback Functions 意思 通过函数指针调用的函数 作用 对特定的事件或条件进行响应 机制 听语音 ⑴定义一个回调函数: ⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者

Sql Server存储过程和函数浅谈

今天给大家总结一下sql server中的存储过程和函数.本人是小白,里面内容比较初级,大神不喜勿喷 自行飘过就是.. 首先给大家简单列出sql server中的流控制语句,后面会用到的^_^ sql server常用控制语句 1.begin..end语句:该语句用来定义一串由顺序执行的SQL语句构成的块. begin statement block end 2.if....else语句:该语句用来定义有条件执行的某些语句. if boolen_expression statement [els

C primer 第十章 函数 浅谈 实参和形参

使用函数的目的: 省去重复代码的编写,可以在多个地方调用,使得程序模块化 主要分三步: 声明函数原型  使用函数  定义函数 1 #include<stdio.h> 2 #include<string.h> 3 #define NAME "heipi" 4 #define ADDRESS "wu han university of techonology " 5 #define PLACE "shang hai , pu dong

C# eval()函数浅谈

<%# Bind("Subject") %> //绑定字段 <%# Container.DataItemIndex + 1%> //实现自动编号<%# DataBinder.Eval(Container.DataItem, "[n]") %>通常使用的方法(这三个性能最好)<%# DataBinder.Eval(Container.DataItem, "ColumnName") %><%# D

浅谈“回调”在程序设计中的好处

1:回调还是返回(return) 在写代码的时候,我们经常碰到这样的场景:调用一个函数或者方法时需要返回多个值给上级调用者,如示例: void methodA(){    Wrap w = methodB();     w.one; //use    w.two; } Wrap methodB(){     do something;     return Wrap; } class Wrap{    Type one;    Type two; } 上面是我刚开始写代码时候常用的方式,在多个类