2012年12月19日 星期三

[C]使用getopt()來parsing command line的參數

在Linux底下我們經常會使用'-'來設定一些參數,比如說grep使用-n來設定顯示搜尋到的行數。
grep -n "test" ./*
當我們自己寫Linux程式時有沒有比較快的方法能parsing這些參數呢?Linux底下有個好用的function叫getopt(),他可以幫住我們來parsing這些參數。要使用getopt()必須要include unistd.h,以下是一個範例:
#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    char ch;
    int count;
    while ((ch = getopt(argc, argv, "d:t")) != EOF) {
        switch (ch) {
        case 'd':
            printf("-d %s\r\n", optarg);
            break;
        case 't':
            printf("-t\r\n");
            break;
        default:
            fprintf(stderr, "Unknown option: '%s'\n", optarg);
            return 1;
        }

    }
    //skip the option we read
    argc -= optind;
    argv += optind;

    for (count = 0; count < argc; count++) {
        puts(argv[count]);
    }
    return 0;
}
sway@mac$ gcc getopt.c -o getopt
sway@mac$ ./getopt -d test -t apple banana
-d test
-t
apple
banana
這邊要注意的是第8行getopt()的第三個參數"d:t"。d後面的:表示-d之後需要再指定一個參數,而此參數可在optarg中取得。t後面沒有:號表示之後不需要再指定參數。

第27行的puts會把不屬於-d -t的剩下所有參數都印出來,optind其實就是前面while迴圈處理到第幾個參數的index。

沒有留言:

張貼留言