Like Share Discussion Bookmark Smile

J.J. Huang   2019-10-27   C C 語言技術 <201910>   瀏覽次數:次   DMCA.com Protection Status

C語言 - 第二十三章 | 指標 - 命令列引數

程式在執行時,可以附加一些引數以指定執行不同的功能。

1
copy -r ./temp ./tmp

其中copy是程式名稱,而-r./temp./tmp都是在程式執行時附加給程式的一些引數,這種程式執行方式在以文字畫面為主的程式中相當常見,稱為命令列引數(Command-line argument)。

在之前的程式中,main()函式在括號中總是void,而如要使用命令列引數,可以在括號中如下填寫。

1
2
3
int main(int argc, char *argv[]) { 
....
}

參數argc是一個整數,它記錄命令列引數的個數,這個數目包括了程式名稱,例如下面的執行指令,argc將記錄為5

1
app hello.c -o -c project.p

每個引數之間以空白作區隔,上面的命令包括程式名稱共會有五個引數,即apphello.c-o-cproject.p,這五個引數分別儲存在使用指標的字串陣列之中,即char *argv[]中。

程式在執行後,argc的值一定會大於1,因為至少包括了程式名稱,而argv則分別儲存了引數的字串。

  • argv[0]"app"
  • argv[1]"hello.c"
  • argv[2]"-o"
  • argv[3]"-c"
  • argv[4]"project.p"

在命令列引數的使用中,如果你的輸入是一個包括空白的字串,則使用""來包括。

1
show "This is a string!"

如此argv[0]是程式名稱"show",而argv[1]的字串就會是"This is a string!"


接下來介紹一些處理命令列引數的技巧,由於命令列引數是儲存在陣列中,取出這些引數的最好方式當然就是使用for迴圈,而會通常使用一個前導字元,例如'-'來指定引數的選項功能,由於argv是個字元陣列,自然地可以使用switch來比對前導字元。

1
2
3
4
5
6
7
8
9
10
for(int i = 1; i < argc; i++) { 
char *arg = argv[i];

switch(arg[0]) {
case '-':
// 處理參數,設定執行選項,例如-o、-p、-r等等
default:
// 執行對應功能
}
}

在判斷執行選項的case中,你可以進一步檢查第二個字元。

1
2
3
4
5
6
7
8
9
10
11
12
13
switch(arg[1]) { 
case 'o':
// 選項o的處理
break;
case 'p':
// 選項p的處理
break;
case 'r':
// 選項r的處理
break;
default:
// 選項錯誤處理或其它處理
}

以上是命令列引數處理時的大致流程,當然不同的程式會有不同的處理方式,不過大致上不離以上的架構。


註:以上參考了
命令列引數