在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...