C/C++—— 分析命令列引數的getopt()函式使用介紹
函式介紹:
首先輸入命令:man 3 getopt 檢視getopt函式的man手冊介紹
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
函式說明 getopt()用來分析命令列引數。引數argc和argv分別代表引數個數和內容,跟main()函式的命令列引數是一樣的。
下面用一個例子來輸出main函式中的argc,argv[ ]內容:
#include <stdio.h>
int main(int argc, char* argv[])
{
int i = 0;
printf("共%d個命令列引數\n", argc);
for(i = 0; i < argc; ++i){
printf("第%d個引數是: %s\n", i+1, argv[i]);
}
return 0;
}
輸出:
root@linux_ever:~/linux_ever/work_test# ./getopt
共1個命令列引數
第1個引數是: ./getopt
root@linux_ever:~/linux_ever/work_test# ./getopt -a -h help
共4個命令列引數
第1個引數是: ./getopt
第2個引數是: -a
第3個引數是: -h
第4個引數是: help
引數 optstring為選項字串, 告知 getopt()可以處理哪個選項以及哪個選項需要引數,
如果選項字串裡的字母后接著冒號“:”,則表示還有相關的引數,全域變數optarg 即會指向此額外引數。
如果在處理期間遇到了不符合optstring指定的其他選項getopt()將顯示一個錯誤訊息,並將全域變數optarg設為“?”字元,如果不希望getopt()列印出錯資訊,則只要將全域變數opterr設為0即可。
getopt() 所設定的全域性變數包括:
optarg---指向當前選項的引數的指標(選項字母:後的引數)。
optind——再次呼叫 getopt() 時的下一個 argv 指標的索引。 optopt——最後一個未知選項。
返回值:
If an option was successfully found, then getopt() returns the option character. If all command-line options have been parsed, then getopt() returns -1. If getopt() encounters an option character that was not in optstring, then '?' is returned. If getopt() encounters an option with a missing argument, then the return value depends on the first character in optstring: if it is ':', then ':' is returned; otherwise '?' is returned.
大概意思就是:
如果一個選項成功被找到,則getopt返回該選項字元,比如a, b, c....
如果所有的選項都被找到,則getopt返回-1。
如果getopt函式遇到了一個在optstring引數中沒有指定的選項,則返回'?'。
如果在-a之後忘了輸出引數,則返回':'(此時optstring中有字元a:),如果不是a:,則返回'?'
optstring中的指定的內容的意義(例如getopt(argc, argv, "ab:c:de::");)
1.單個字元,表示選項,(如上例中的abcde各為一個選項)
2.單個字元後接一個冒號:表示該選項後必須跟一個引數。引數緊跟在選項後或者以空格隔開。該引數的指標賦給optarg。(如上例中的b:c:)
3 單個字元後跟兩個冒號,表示該選項後可以跟一個引數,也可以不跟。如果跟一個引數,引數必須緊跟在選項後不能以空格隔開。
該引數的指標賦給optarg。(如上例中的e::,如果沒有跟引數,則optarg = NULL),但是在例項中測試卻是::沒什麼作用。。
例項:
/*************************************************************************
> File Name: getopt.c
> Author:
> Mail:
> Created Time: 2016年03月31日 星期四 17時18分23秒
************************************************************************/
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
printf("*****************************************\n");
int i = 0;
printf("共%d個命令列引數\n", argc);
for(i = 0; i < argc; ++i){
printf("第%d個引數是: %s\n", i+1, argv[i]);
}
printf("*****************************************\n");
char ch;
while((ch = getopt(argc, argv, "a:bc::h")) != -1){
//printf("optind = %d, optopt = %d\n", optind, optopt);
switch(ch){
case 'a':
printf("選項是%c, 選項內容: %s\n", ch, optarg);
break;
case 'b':
printf("選項是%c, 選項內容: %s\n", ch, optarg);
break;
case 'c':
printf("選項是%c, 選項內容: %s\n", ch, optarg);
break;
case 'h':
printf("選項是%c\n", ch);
printf("-a optstring\n");
printf("-b\n");
printf("-c optstring or NULL\n");
printf("-h");
break;
default:
printf("other option: %c\n", ch);
break;
}
}
return 0;
}
輸出:
root@linux_ever:~/linux_ever/work_test# ./getopt -h
*****************************************
共2個命令列引數
第1個引數是: ./getopt
第2個引數是: -h
*****************************************
選項是h
-a optstring
-b
-c optstring or NULL
-hroot@linux_ever:~/linux_ever/work_test# ./getopt -a linux_ever
*****************************************
共3個命令列引數
第1個引數是: ./getopt
第2個引數是: -a
第3個引數是: linux_ever
*****************************************
選項是a, 選項內容: linux_ever
root@linux_ever:~/linux_ever/work_test# ./getopt -a linux_ever -b
*****************************************
共4個命令列引數
第1個引數是: ./getopt
第2個引數是: -a
第3個引數是: linux_ever
第4個引數是: -b
*****************************************
選項是a, 選項內容: linux_ever
選項是b, 選項內容: (null)
root@linux_ever:~/linux_ever/work_test# ./getopt -a linux_ever -b -c ever
*****************************************
共6個命令列引數
第1個引數是: ./getopt
第2個引數是: -a
第3個引數是: linux_ever
第4個引數是: -b
第5個引數是: -c
第6個引數是: ever
*****************************************
選項是a, 選項內容: linux_ever
選項是b, 選項內容: (null)
選項是c, 選項內容: (null)
相關文章
- C++ main函式命令列引數使用C++AI函式命令列
- 命令列引數選項處理:getopt()及getopt_long()函式使用命令列函式
- 命令列引數解析函式getopt_long() 使用詳解命令列函式
- linux的命令列解析引數之getopt_long函式使用Linux命令列函式
- 一個使用getopt()函式獲取命令列引數的例子(轉)函式命令列
- 1.linux的命令列解析引數之getopt_long函式Linux命令列函式
- 使用getopt_long()從命令列獲取引數命令列
- 【C】 33_main 函式與命令列引數AI函式命令列
- C++ 函式的可變引數C++函式
- 使用getopt_long()從命令列獲取引數,struct option命令列Struct
- linux 中解析命令列引數 (getopt_long用法)Linux命令列
- Oracle 分析函式使用介紹(轉)Oracle函式
- c++函式引數和返回值C++函式
- C++行內函數、函式過載與函式預設引數C++函數函式
- c++中getopt和getopt_long的使用方法C++
- Linux程式設計——用getopt處理命令列引數Linux程式設計命令列
- c++中物件的引用作為函式的引數C++物件函式
- 關於C++引用做為函式引數和指標作為函式引數C++函式指標
- C++ 列舉型別介紹C++型別
- SVN命令列使用介紹命令列
- C語言中的命令列引數C語言命令列
- C/C++多引數函式引數的計算順序與壓棧順序C++函式
- SED 手冊 - 4.介紹函式引數(轉)函式
- Linux下getopt函式的使用Linux函式
- C++ 類建構函式初始化列表介紹C++函式
- setTimeout()呼叫的函式傳遞引數簡單介紹函式
- C/C++語言新增“函式過載”功能簡單介紹和使用方法C++函式
- 使用 getopt() 進行命令列處理命令列
- C/C++—— C++中建構函式不能是虛擬函式的原因分析C++函式
- javascript的split()函式使用介紹JavaScript函式
- C#的Replace函式,使用函式作為的引數需要注意C#函式
- 在定義C++, C通用介面函式時讓C++介面支援預設引數C++函式
- C/C++——指向函式的指標和指向函式的指標的陣列C++函式指標陣列
- Geth的命令列介紹命令列
- zblog獲取GET/POST等值函式“GetVars”引數和使用方法介紹函式
- setTimeout()函式第一個引數帶引號報錯原因介紹函式
- Linux下getopt()函式的簡單使用Linux函式
- Linux中getopt函式、optind等變數使用詳解Linux函式變數