首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

ACE_Get_Opt 命令列參數解析完整教學與實戰範例

     編輯:關於C++

為何需要命令列解析庫?

控制台工具常需解析複雜參數(短選項 -s、長選項 --server、帶參數選項、選項排序等),手寫解析易出錯且難維護。ACE_Get_Opt 提供標準化、健壯的解決方案。

建構子參數詳解


ACE_Get_Opt(int argc, ACE_TCHAR **argv,
            const ACE_TCHAR *optstring = "", // 短選項定義
            int skip_args = 1,               // 跳過 argv[0]
            int report_errors = 0,           // 遇到未知選項是否報錯
            int ordering = PERMUTE_ARGS,     // 選項/非選項處理順序
            int long_only = 0);              // 是否允許單破折號長選項

optstring 規則:

  • s:單純選項,無參數
  • s::選項需帶參數(參數可在同一或下一個 argv)
  • s:::選項參數可選(必須在同一 argv)
  • 前置字元:+ → REQUIRE_ORDER,- → RETURN_IN_ORDER,: → 缺參數時回傳 : 而非 ?

長選項註冊 long_option()


// 註冊長選項對應短選項
int long_option(const ACE_TCHAR *name, int short_option,
                OPTION_ARG_MODE has_arg = NO_ARG);

// 解析過程中取得觸發的長選項名稱
const ACE_TCHAR *long_option(void) const;

解析迴圈核心 API

  • int operator()():回傳解析到的短選項字元、0(長選項)、EOF(-1, 結束)、?/:(錯誤)、'1'(非選項參數)
  • ACE_TCHAR *opt_arg():取得目前選項的參數值
  • int opt_ind():下一個待處理 argv 索引

完整實戰範例


#include "ace/Get_Opt.h"
#include 
using namespace std;

int _tmain(int argc, _TCHAR* argv[]) {
    ACE_Get_Opt opt(argc, argv, "s:u:p:", 1, 0); // 三個短選項皆需參數

    // 註冊長選項
    if (opt.long_option("server", 's', ACE_Get_Opt::ARG_REQUIRED) == -1)
        cout << "server option add failed\n";
    if (opt.long_option("user", 'u', ACE_Get_Opt::ARG_REQUIRED) == -1)
        cout << "user option add failed\n";
    if (opt.long_option("pwd", 'p', ACE_Get_Opt::ARG_REQUIRED) == -1)
        cout << "pwd option add failed\n";

    // 解析迴圈
    for (int arg = 0; (arg = opt()) != -1; ) {
        switch (arg) {
            case 's': cout << "server is " << opt.opt_arg() << endl; break;
            case 'u': cout << "user is " << opt.opt_arg() << endl; break;
            case 'p': cout << "pwd is " << opt.opt_arg() << endl; break;
            case 0: // 長選項
                if (_stricmp(opt.long_option(), "server") == 0)
                    cout << "long option server is " << opt.opt_arg() << endl;
                break;
            default: break;
        }
    }

    // 使用說明
    if (opt.opt_ind() + 2 < argc) {
        cout << "Usage: GetOptTest.exe [options]\n"
             << "\t-s, --server  server address\n"
             << "\t-u, --user    user name\n"
             << "\t-p, --pwd     password\n";
    }
    return 0;
}

執行測試

命令列: -s 127.0.0.1 --server 192.168.0.1 -u hbccdf -p pwdfortest

短/長選項混用、參數正確解析、未知選項自動報錯(report_errors=1 時)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved