linux c開發(fā): 處理命令行參數(shù)

在Linux c語(yǔ)言開發(fā)時(shí),可使用getopt_long獲取命令行參數(shù)露筒,這個(gè)方法同時(shí)支持短選項(xiàng)和長(zhǎng)選項(xiàng),比較方便敌卓。(因?yàn)檫x項(xiàng)可以帶參數(shù),為了不和命令行參數(shù)混淆伶氢,這里命令行參數(shù)稱為選項(xiàng))
邊看代碼趟径,邊做分析:

#include <stdio.h>
#include <getopt.h>   //需要包括此頭文件

// Values for long options 
// 長(zhǎng)選項(xiàng)對(duì)應(yīng)的整數(shù)值瘪吏,在long_options結(jié)構(gòu)體數(shù)組中,對(duì)長(zhǎng)選項(xiàng)名對(duì)應(yīng)的整數(shù)值進(jìn)行定義
enum {
    LONGOPT_VAL_TIMEOUT = 257, //注意我們定義的值從257開始蜗巧,是為了避開短選項(xiàng)
    LONGOPT_VAL_MPORT
};

// 定義短選項(xiàng)掌眠,如果有必選參數(shù)就要在選項(xiàng)名后加冒號(hào),無(wú)參數(shù)或可選參數(shù)則不要
// 短選項(xiàng)的用法是一個(gè)-后面跟選項(xiàng)名幕屹,如果有參數(shù)空格加參數(shù)蓝丙,例如 ./myserver -c cfg.json
// 如果是可選參數(shù)則要使用兩個(gè)-,并用等號(hào)賦值,例如:./myserver --v=5
static const char *short_options = "c:vh";

// 長(zhǎng)選項(xiàng)的用法是兩個(gè)-后面選項(xiàng)名望拖,如果有參數(shù)需要看是必須參數(shù)還是可選參數(shù)渺尘。
// 定義長(zhǎng)選項(xiàng)數(shù)組,每一項(xiàng)是一個(gè)結(jié)構(gòu)體说敏,第一個(gè)成員是長(zhǎng)選項(xiàng)名鸥跟,第二個(gè)成員是參數(shù)使用情況,包括:
// required_argument:必須參數(shù)盔沫,在命令行中需要跟在選項(xiàng)名后面用空格分開医咨,例如 ./myserver --port 8000 或者用等號(hào)連接 ./myserver --port=8000
// no_argument: 沒(méi)有參數(shù),那么在選項(xiàng)之后就不能寫參數(shù)架诞,如果用等號(hào)加參數(shù)就會(huì)報(bào)錯(cuò) option '--help' doesn't allow an argument拟淮,如果空格加參數(shù),那參數(shù)會(huì)被認(rèn)為是一個(gè)選項(xiàng)谴忧。
// optional_argument: 可選參數(shù)很泊,只能使用等號(hào)添加。例如 ./myserver --verbose=5
// 結(jié)構(gòu)體第四個(gè)成員是選項(xiàng)對(duì)應(yīng)的整數(shù)值俏蛮。值得注意的是撑蚌,這里長(zhǎng)選項(xiàng)的整數(shù)值可以填入短選項(xiàng)的字符,這樣長(zhǎng)短選項(xiàng)可以關(guān)聯(lián)起來(lái)搏屑,達(dá)到相同的效果争涌。如果長(zhǎng)選項(xiàng)沒(méi)有對(duì)應(yīng)可用的短選項(xiàng),則這兒要定義一個(gè)數(shù)值辣恋,這個(gè)數(shù)值最好大于256亮垫,避免和短選項(xiàng)值沖突。下面會(huì)看到getopt_long返回值就是這個(gè)數(shù)值伟骨,通過(guò)這個(gè)數(shù)值進(jìn)行不同的操作饮潦。

static const struct option long_options[] = {
        {"port", required_argument, NULL, 'p'},
        {"timeout", required_argument, NULL, LONGOPT_VAL_TIMEOUT},
        {"config", required_argument, NULL, 'c'},
        {"verbose", optional_argument, NULL, 'v'},
        {"help", no_argument, NULL, 'h'},
        {NULL, 0, NULL, 0}
};

int main(int argc, char *argv[])
{
      char *config_file = NULL;
      char *port = NULL;
      float timeout = 0.0f;
      int verbose = 0;

      int opt = 0;
      while( (opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1){
        switch (opt){
            case 'h':
            case '?': //如果是不能識(shí)別的選項(xiàng),則opt返回'?'
                fprintf(stdout, "Usage: %s -p <port>  [-v|--v <=verbose_level>] [-h]\n", argv[0]);
                return 0;
            case 'c':
                config_file = optarg;
                break;
           case 'p': // 'p'是個(gè)短選項(xiàng)携狭,但是長(zhǎng)選項(xiàng)port的值也是'p'继蜡,所以這里同時(shí)處理了port
                port = optarg;
                break;
           case LONGOPT_VAL_TIMEOUT: //長(zhǎng)選項(xiàng)timeout的值
                timeout = atof(optarg);
                break;
           case 'v': // verbose有可選參數(shù),所以這兒判斷是否有參數(shù)
                if(optarg == NULL){
                     verbose = 1;
                }
                else {
                     verbose = atoi(optarg);
                }
                break;
        }
     }

     return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稀并,隨后出現(xiàn)的幾起案子仅颇,更是在濱河造成了極大的恐慌,老刑警劉巖碘举,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘瓦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡引颈,警方通過(guò)查閱死者的電腦和手機(jī)耕皮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝙场,“玉大人凌停,你說(shuō)我怎么就攤上這事±罘幔” “怎么了苦锨?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)趴泌。 經(jīng)常有香客問(wèn)我舟舒,道長(zhǎng),這世上最難降的妖魔是什么嗜憔? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任秃励,我火速辦了婚禮,結(jié)果婚禮上吉捶,老公的妹妹穿的比我還像新娘夺鲜。我一直安慰自己,他們只是感情好呐舔,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布币励。 她就那樣靜靜地躺著,像睡著了一般珊拼。 火紅的嫁衣襯著肌膚如雪食呻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天澎现,我揣著相機(jī)與錄音仅胞,去河邊找鬼。 笑死剑辫,一個(gè)胖子當(dāng)著我的面吹牛干旧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妹蔽,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼椎眯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挠将!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起盅视,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捐名,失蹤者是張志新(化名)和其女友劉穎旦万,沒(méi)想到半個(gè)月后闹击,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡成艘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年赏半,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淆两。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡断箫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秋冰,到底是詐尸還是另有隱情仲义,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布剑勾,位于F島的核電站埃撵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虽另。R本人自食惡果不足惜暂刘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捂刺。 院中可真熱鬧谣拣,春花似錦、人聲如沸族展。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仪缸。三九已至贵涵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腹殿,已是汗流浹背独悴。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锣尉,地道東北人刻炒。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像自沧,于是被迫代替她去往敵國(guó)和親坟奥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子树瞭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,176評(píng)論 2 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)爱谁,斷路器晒喷,智...
    卡卡羅2017閱讀 134,715評(píng)論 18 139
  • 《荊棘鳥》這部家世小說(shuō)是悲劇風(fēng)格,悲傷是貫穿整個(gè)小說(shuō)的基調(diào)访敌,并渲染著了文里文外的每一個(gè)人凉敲。 隨著作者的...
    八一見君姐閱讀 887評(píng)論 2 7
  • 如果你想做小發(fā)明、小創(chuàng)造寺旺,當(dāng)然智商很重要爷抓,如果你想赤手空拳帶一個(gè)小團(tuán)隊(duì)闖出一片天,情商很重要阻塑,假如你要改變這個(gè)世界...
    光華同學(xué)閱讀 1,698評(píng)論 0 1
  • 風(fēng)雨聲蓝撇,一聲聲。夜半憑誰(shuí)挑油燈陈莽,三更又四更渤昌。 離愁深,獨(dú)深深走搁。柳絮多情亂黃昏独柑,莫吹相思人。
    深海有光yzl閱讀 405評(píng)論 0 3