C Programming: 使用<getopt.h>

前言

這陣子想要來嘗試 真的開發,但想說如果只是自己搞自己喜歡的方向,多少會侷限方向(人總是有死角)
最好的解決方法當然就是去找個open source的專案來參與!
我心中的兩大人選:

  • Elementary OS
  • i3 Window manager

由於對GUI程式開發還不是那麼熟,於是先選了i3 WM來著手
在閱讀i3lock的程式碼時,便發現了getopt這個有趣且方便的工具!

介紹

使用過CLI的人,都知道CLI程式可以輸入各種 參數, 像是 ls -s grep --color
而管理參數的功能,其實都已經包含在getopt.h當中了!先來看程式碼

main.c
#include "stdio.h"
#include "stdlib.h"
#include "getopt.h"

int
main( int argc, char* argv[] )
{
    //Option index
    int optind = 0;
  
      //定義參數, struct option爲optget.h中的定義struct
    struct option longopts[] = {
        { "version", no_argument, NULL, 'v' },
        { "hello", requireed_argument, NULL, 'h' }
    };
  
    int opt;
    while( ( opt = getopt_long( argc, argv, "vh:", longopts, optind ) != -1 ){
        switch( opt ){
        case 'v':
            printf( "Version: 12.3\n" );
            break;
      
        case 'h':
            printf( "Hello, %s\n", optarg );   //optarg是getoptarg.h中的定義
            break;
            
        case "?":
        default:
            printf( "Usage: thisapp [-h name] [-v]\n" );
            exit( 1 );
        }
  }
  
    return 0;
}

如此,我們的程式就能夠接受-v-h name這兩種參數(假設編譯出來的執行檔名爲“thisapp")
也夠我們的程式去設定需要的參數了!

$ thisapp

$ thisapp -v
Version: 12.3

$ thisapp --version
Version: 12.3

$ thisapp -h
Usage: thisapp [-h name] [-v]

$ thisapp -h KK
Hello, KK

$ thisapp -w
thisapp: invalid option -- 'w'
Usage: thisapp [-h name] [-v]

簡單解說

  • struct option longopts[]
    這部分應該很好理解,設定該指令對應的 字串, 是否需要參數, Flag, 字元
    flag牽涉到一些細節,在此先不多談(我也還沒搞懂),可以去查閱getopt的man page

  • getopt_long( argc, argv, "vh:", longopts, optind )
    argc, argv不用說,正是我們呼叫thisapp時輸入的參數資訊,這邊getopts替我們做了更好的功能
    “vh:”這部分, 前兩個英文對應的是我們定義的兩個指令,-v-h,冒號則表示-h指令後面需要接參數
    如果-h後沒加上冒號,則程式執行時是不會去讀取參數的

  • case "?":
    這個case表示的情況爲:你呼叫了需要接上參數的option,但是沒給參數
    或者是,你給了未定義的參數(例如上面範例的thisapp -w)

雜談

My first commit
我人生第一次的commit成功推上i3lock了!!

參考資料

查閱man 3 getopts

Comments

comments powered by Disqus