getopt 簡單回顧一下

2021-09-11 08:30:16 字數 2752 閱讀 1688

getopt -- 解析命令的可選項

【說明】getopt只是乙個簡單的解析命令可選項的函式,只能進行簡單的格式命令解析,格式如下:

1、形如:cmd [-a][-b] //對短選項的解析;

2、形如:cmd [-a a_argument][-b b_argument] //對短選項及短選項的引數解析;

3、形如:cmd [-a[a_argument]] //選項a的引數也是可選的情況解析

#include extern char *optarg; 

extern int optind, opterr, optopt;

int getopt(int argc, char * const ar**, const char *optstring);

1、getopt函式解析命令列引數,argcar**是呼叫main函式時傳入的引數。傳入的'-'開始的字元被解析為選項,getopt一次執行解析出乙個option,如果迴圈執行,可以將ar**中的全部option解析出來;

2、在getopt的執行中,每次進入都會更新optind變數,該變數指向下乙個ar**引數;

3、如getopt返回-1,表示ar**中的所有選項被解析出,optind指向第乙個非選項的argument元素;這裡要注意,在getopt執行過程中會將單獨的argument交換到ar**陣列的後面,option選項提前,如:cmd -a file1 -b file2,如果a/b均為不帶引數的選項,這最終ar**陣列變為:cmd -a -b file1 file2;

4、optstring指定選項合法的選項,乙個字元代表乙個選項,在字元後面加乙個':'表示該選項帶乙個引數,字元後帶兩個':'表示該選項帶可選引數(引數可有可無),若有引數,optarg指向該該引數,否則optarg為0;

5、前面說了getopt會進行ar**順序的調整,但也可以通過設定optstring改變它的方式,這裡有兩種:

1) 如果optstring的第乙個引數是'+'或者posixly_correct被設定,則getopt在原ar**的順序上遇到第乙個非選項就返回-1;

2) 如果optstring的第乙個引數是'-',則會將所有的非選項當選項處理,並且返回1,用字元**1表示該選項;

6、如果getopt不能識別乙個選項字元,它會列印乙個錯誤訊息到stderr上,並將該字元存放到optopt中,返回'?';呼叫程式可以設定opterr=0設定不列印錯誤資訊;注意:要使能列印錯誤資訊,optstring的第乙個字元(或者在第乙個字元是+/-之後)不能是':',否則也不會列印錯誤;

7、如果optstring中指定了option需要引數,但在命令列沒有引數,那麼getopt將返回'?',如果在optstring的第乙個字元(或者在第乙個字元是+/-之後)是':',那麼將返回':';

1、返回型別為int,這個在程式設計的時候要注意,因為返回值型別範圍要包含-1,很容易返回值接收定義為char,但在一些系統中char是無符號的,將導致程式錯誤;

2、當傳入的ar**中的選項全部被解析,getopt()返回-1,這也是getopt進行選項解析的迴圈截至條件;

3、如果ar**中解析出optstring中描述的選項字元,則返回該字元,如果該選項指定了引數,則全域性變數optarg指向該引數;

4、如果getopt遇到乙個非optstring指定的選項字元,這表示該選項是未識別的,返回'?',並且將該選項存放到全域性變數optopt中;

5、如果optstring指定了選項必須帶引數,但傳入的相應option丟失了引數,返回值依賴於optstring的第乙個字元,若第乙個字元是':',返回':',否則返回'?';由於非法的選項返回也是'?',所以常常optstring的第乙個字元指定為':';同時將該選項存放到全域性變數 optopt中;

因為getopt在vs環境下找不到,所以直接用了acl封裝的乙個getopt了!

#include "stdafx.h"

#include #include #include char *acl_optarg = null; /* global argument pointer. */

int acl_optind = 0; /* global ar** index. */

static char *scan = null; /* private scan pointer. */

int acl_getopt(int argc, char * ar**, const char *optstring)

scan = ar**[acl_optind]+1;

acl_optind++;

} c = *scan++;

place = strchr((char*)optstring, c);

if (place == null || c == ':')

place++;

if (*place == ':') else if (acl_optind < argc) else

} return(c);

}#if defined(_win32) || defined(_win64)

# define optind acl_optind

# define optarg acl_optarg

# define getopt acl_getopt

#endif

int main(int argc, char* ar**)

回顧一下這段時間

自從小兒子出生以來,每天睡眠不好,加上年底雜事比較多,好久沒有看專業書籍,也沒有寫部落格了。這是病,得改,任何事情都貴在堅持。最近對專案管理和質量管理進行了一些實操性質的研究,實際就是考慮怎麼把規範 標準 體系的要求落實到具體的日常工作中去。下面是一些老生常談 1 流程要梳理清晰。各項工作用的表單,...

回顧一下 棧和佇列

下面來回顧一下 資料結構中比較常用的兩種型別 棧和佇列 棧 是乙個特殊的線性表,只能在一端操作,即先進後出 棧頂 允許操作的一端 棧底 不允許操作的一端 空棧 不含任何資料元素的棧,top 1,當棧中有乙個元素時,top 0 一 順序儲存 一般採用迴圈佇列 順序儲存中,我們通常用陣列下標表示結點的位...

簡單介紹一下OGraph

摘要 該引擎的目標在於能夠渲染3d場景,和視覺化複雜網路 並且支援方便的資料介面,遊戲一般的互動體驗。引擎嵌入python為使用者提供api,編寫python 讀取處理資料後提交到渲染介面,即可實時渲染。使用瀏覽器核心向使用者展示ui,管理場景物件樹 物件屬性。使用者也可以自己重新編寫html頁面自...