#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt;
這個函數是用來解析命令行的選項的。可是,只能解析短選項,什麼是短選項?就是-d這種只有一個-的,並且是隻有一個字母的。數組
首先要注意幾個外部變量optarg,optind,opterr。函數
opterr設置爲0時,當解析命令出錯也不向標準輸出打印任何信息。ui
optarg是當前解析到的選項的後面帶的參數,特別注意必須使用空格來間隔掉選項和後面的值。-d 100,切記只用空格,不要用=。並且getopt只可以解析那些在optstring參數中後面帶有了:的選項,如"abcd:"。spa
optind 是指向char *argv[]數組中的當前被處理的參數的下一個位置的指標。能夠看做是逾尾指針的性質。命令行
參數詳解:optstring這個參數就是用來配置選項參數的。"abcd:",冒號就表示能夠帶參數。指針
返回值:這個函數直接返回當前解析的短選項的名字,如命令行中爲-d,那麼這裏返回字符d。若是當前全部參數所有解析完,那麼此次調用返回-1。通常getopt()函數調用就放在while的判斷條件中,直到返回值爲-1時爲止。code
#include <getopt.h> int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); int getopt_long_only(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
getopt_long()函數能夠解析帶有長選項參數,如--prefix=/boot/等等,可是若是要禁止使用短參數,則必須將optstring參數設置爲空字符串「」。字符串
參數詳解:get
longopts 指向struct option結構體數組的第一個元素的指針。注意這個數組的最後一個元素必須是用全0來填充{0,0,0,0}。這個結構體定義在<getopt.h>中。下面看下這個結構體:string
struct option { const char *name; //這個長選項的名字 int has_arg; // 這個長選項可攜帶的參數的狀況,no_argument (or 0 不帶參數),required_argument (or 1 須要參數),optional_argument (or 2 可選參數,可帶可不帶) int *flag; // 這個成員比較複雜。1 若是設爲NULL,那麼getopt_long()函數直接返回val的值 int val; // 2 若是不爲NULL,那麼getopt_long()函數直接返回0,同時,name表示的選項有的話就將val的值賦值給flag指針指向的int變量,name選項沒有的話,flag指向的變量維持原狀。 };
getopt_long_only函數,它與getopt_long函數使用相同的參數表,在功能上基本一致。
getopt_long只將--name看成長參數,那麼對於-name直接當成-n -a -m -e 去解析。
getopt_long_only會將--name和-name兩種選項都看成長參數來匹配,那麼對於-name先當作--name來處理,不能匹配時,纔去解析爲-n -a -m -e。