用getopt處理main函式的引數

2021-06-26 22:17:03 字數 1931 閱讀 3092

在c語言中,main函式的宣告如下:

int main

(int argc,char *argv);

argc是指程式引數的個數,包括程式名本身,如果程式不帶引數,argc為1;

argv的每個陣列元素存放乙個程式引數,程式名存放在argv[0];

例如:$ ls -l

此時,argc為2,argv[0]是ls,argv[1]是-l。

程式的引數可以分為三種:選項,選項的關聯值,非選項引數。例如:

$gcc hello.c -o hello  

hello.c是非選項引數,-o是選項,hello是-o選項的關聯值。

根據linux的慣例,程式的選項應該以乙個短橫線開頭,後面包含單個字母或數字,選項分為兩種:帶關聯值的和不帶關聯值的,例如:

$gcc hello.c -o hello

選項-o必須帶乙個關聯值。

$ls -l

選項-l無需帶引數。

不帶關聯值的選項應該可以在乙個短橫線後合併使用,例如:

$ls -la

linux系統提供了getopt函式,它用來按照上述規則處理程式的引數,相關定義如下:

#include 

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

extern char *optarg;

extern int optind,opterr,optopt;

getopt使用main函式的argc和argv作為前兩個引數,optsting是乙個字元列表,每個字元代表乙個單字元選項,如果乙個字元後面緊跟以冒號(:),表示該字元有乙個關聯值作為下乙個引數;

getopt的返回值是argv陣列中的下乙個選項引數,由optind記錄argv陣列的下標,如果選項引數處理完畢,函式返回-1;

如果遇到乙個無法識別的選項,返回問號(?),並儲存在optopt中;

如果乙個選項需要乙個關聯值,而程式執行時沒有提供,返回乙個問號(?),如果將optstring的第乙個字元設為冒號(:),這種情況下,函式會返回冒號而不是問號。

選項引數處理完畢後,optind會指向argv陣列尾部的其他非選項引數。實際上,getopt在執行過程中會重排argv陣列,將非選項引數移到陣列的尾部。例:

下面這個程式需要提供兩個無關聯值的選項:-v,-g;乙個需要關聯值的選項:-t;乙個非選項引數。

#include

#include

int main(int argc,char *argv)

}//處理非選項引數

for(i=0;optind

//呼叫getopt後列印argv陣列

for(i=0;iprintf("%d:%s/n",i,argv[i]);

return 0;

}編譯:gcc -wall getopttest.c -o getopttest

執行:

$./getopttest arg1 -vg -t value -x arg2

0:./getopttest

1:arg1

2:-vg

3:-t

4:value

5:-x

6:arg2

option:v

option:g

option:t = value

unknow option:x

argument:arg1

excess argument:arg2

0:./getopttest

1:-vg

2:-t

3:value

4:-x

5:arg1

6:arg2

從執行結果可以看出,getopt函式重排了argv陣列,將非選項引數arg1排到了陣列尾部

t 使用getopt改寫main函式

一 執行ees test 原始的輸入方式 a.首先進入可執行檔案所在的目錄 cd home lihaoliang eclipse workspace nichebreadth default b.執行可執行檔案,並附帶引數 nichebreadth home lihaoliang ees test ...

IDLE處理main 函式引數

命令列裡可以直接加引數傳遞給主函式。idle沒有輸入引數的地方 貌似pythonwin有,沒用過,不確定 假設下面的scripts名叫helloworld.py,此時如果要用idle執行,需要在main函式一開始的地方加入以下語句 import sys blablabla.other codes d...

程式引數處理 getopt

把以前用到的東西粘過來,搞cui用到 1 posix約定 下面是posix標準中關於程式名 引數的約定 2 命令列引數解析函式getopt getopt 函式宣告如下 include int getopt int argc,char const argv,const char optstring e...