getopt

来源:互联网 发布:北风网java视频教程 编辑:程序博客网 时间:2024/06/14 10:30

说明

以下内容参看man手册编写。



函数原型

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


介绍

全局变量optarg用来指向选项后面跟着的参数,若选项后面没有参数,则为null。

全局变量optind用来指示下一个将要处理的参数选项的索引值,系统将其初始化为1(不包括可执行程序本身)。调用者可以手动将其置1,使重头检测参数。

全局变量optopt用来存储非合法的选项字符(对应整数),合法情况下,值为0。

全局变量opterr非0情况下,如遇到需要指定参数却没有的,或遇到非合法选项字符的, 系统会默认打印相应的错误信息到stderr。若不想打印该信息,可通过全局变量opterr置0来实现,或者在optstring所指向的字符串的第一个字符置‘:’。



getopt()函数参数选项

argc和argv就是main函数传进来的参数个数和参数内容数组(两者都包括执行的程序本身);

optstring所指向的字符串包含合法的选项字符,若选项后面没有冒号,则不需要指定参数;若在选项后面加有冒号,表示若使用该选项是必须指定参数的;若选项后面跟两个冒号,表示参数是可选的(如要指定参数,该参数是紧跟在选项后面,中间没有空格隔开,否则就当没有指定参数)。若第一个字符是‘+’,则遇到不是选项的参数时,程序停止检测并退出。若第一个字符是‘-’,则扫描所以选项参数,对于非选项参数,返回1;不加‘-’,也会扫描所有选项参数,只是对于非选项参数,返回63(对应‘?’)。


函数功能

getopt()函数用来解析命令行参数,getopt()将以‘-’开头,紧随其后的字符作为一个选项返回(该字符对应的整数),同时更新optind,以便下次调用接着检测剩余参数;如果没有可检测的参数选项了,则返回-1。若遇到参数‘--’,则强制停止,不继续扫描后面的参数。


返回值

正常情况返回选项字符;无可检测参数时返回-1。如遇到非合法的字符,则返回字符‘?’;如需要指定参数而没有,则函数返回的值根据optstring指向的字符串第一个字符是否是‘:’,如果是‘:’,则返回‘:’,否则返回‘?’。


例子

#include <unistd.h>#include <stdlib.h>#include <stdio.h>int main(int argc, char *argv[]){int flags, opt;int nsecs, tfnd;nsecs = 0;tfnd = 0;flags = 0;printf("argc = %d\n", argc);while ((opt = getopt(argc, argv, "nt:")) != -1){switch (opt){case 'n' :flags = 1;break;case 't':nsec = atoi(optarg);tfnd = 1;break;default:printf("error\n");}printf("flags = %d; ftnd = %d; optind = %d\n", flags, tfnd, optind);if (optind >= argc){printf("error 2\n");}} return 0;}




0 0