명령행 매개변수 해석

8700 단어
우리가 프로그램을 쓸 때 자주 매개 변수를 입력해야 한다. 그러면 매개 변수를 해석하는 부분과 관련된다. 가장 원시적인 것은 스스로 해석하는 것이다. 사용하는 주요 함수는 getopt()이다. 긴 명령이라면 getopt 를 사용한다.long
헤더 파일: #include함수 정의: int getopt(int argc,char * constarg v[],const char * optstring);   extern char *optarg;    extern int optind, opterr, optopt; 설명: Getopt 함수는 명령행의 매개 변수를 분석하는 데 사용되며, 매개 변수argc와argv는main()이 전달하는 매개 변수의 개수와 내용입니다. 매개 변수optstring은 옵션 문자열로 Getopt()가 어떤 옵션을 처리할 수 있고 어떤 옵션이 필요한지 알려 줍니다.string에서 지정한 내용의 의미 (예를 들어 getopt (argc,argv, "ab: c: de::"): 단일 문자로 옵션을 표시합니다. (예컨대 abcde는 각각 하나의 옵션입니다) 단일 문자 뒤에 사칭을 붙입니다. 이 옵션을 표시한 후 매개 변수와 함께 해야 합니다.매개변수는 옵션 바로 뒤에 있거나 공백으로 구분됩니다.이 매개 변수의 바늘은optarg에 부여됩니다.(예를 들어 상례의 b:c:) 단일 문자 뒤에 두 개의 사칭이 붙으면 이 옵션을 선택한 후에 반드시 하나의 인자를 따라야 한다는 것을 나타낸다.매개변수는 옵션 바로 뒤에 있어야 하며 공백으로 구분할 수 없습니다.이 매개 변수의 바늘은optarg에 부여됩니다.(예에서 e::) getopt 함수에 설정된 전역 변수는 다음과 같습니다:optarg: 현재 옵션 인자 (있을 경우) 를 가리키는 바늘optind: getopt () 를 다시 호출할 때 다음argv 바늘의 인덱스입니다.opterr: 오류 정보를 인쇄할지 여부입니다. getopt () 오류 정보를 인쇄하지 않으려면 전역 변수opterr를 0으로 설정하면 됩니다.optopt: 마지막으로 알려진 옵션입니다.
#include <stdio.h>
#include <string.h>
#include <getopt.h>

extern char *optarg;
extern int opterr;

int main(int argc,char **argv)
{
        int c,index;
        char host[128] = "127.0.0.1";
        int port = 8000;

        struct option opts[] = {
        {"host",required_argument,NULL,'h'},
        {"port",required_argument,NULL,'p'},
        {0,0,0,0}
        };

        opterr = 0;

        while((c=getopt_long(argc,argv,"h:p:",opts,NULL)) != -1)
        {
                switch(c)
                {
                        case 'h':
                                strcpy(host,optarg);
                                break;
                        case 'p':
                                port = atoi(optarg);
                                break;
                        case '?':
                                printf("Usage : 
" "-h host : set ip address
" "-p port : set port
" ); return 1; default: break; } } printf( "ip : %s
" "port : %d
", host,port); for(index = optind;index < argc;index++) printf("Non-option argument %s
",argv[index]); return 0; }

이 일을 할 수 있는 라이브러리가 많으니 직접 가져와서 사용하면 된다. 예를 들어 Boost.Program_options와 clpp
1)
Boost.program_options는 프로그램 옵션을 설정하는 데 편리한 명령줄과 프로필을 제공합니다.프로그램 사용옵션 라이브러리는 당신이 직접 작성한 해석 코드가 아니라 프로그램 옵션을 설명하는 문법이 간결하고 라이브러리 자체도 매우 작기 때문입니다.옵션 값을 적합한 유형 값으로 변환하는 작업도 자동으로 완료됩니다.라이브러리에는 완비된 오류 검사 메커니즘이 있는데, 만약 자신이 손으로 코드를 해석할 때, 일부 오류 상황에 대한 검사를 놓칠 수 있다.마지막으로 옵션 값은 명령줄뿐만 아니라 설정 파일, 심지어 환경 변수에서도 추출할 수 있으며 이러한 선택은 뚜렷한 작업량을 증가시키지 않는다.
보스트는 hpp에서 직접 호출하면 된다고 생각했는데 최근에 두 가지 예를 만났는데 하나는 보스의thread이고 다른 하나는 Programoptions,boost는 컴파일된 후에 라이브러리 파일이 있을 것입니다. 현재libs 아래가 아니라 Stage/libs 아래입니다. 이 모듈을 사용할 때 상응하는 동적이나 정적 라이브러리를 추가해야 합니다.
예시 설명
아래의 간단한 Hello 프로그램으로 설명하자면 기본적으로 Hello World를 인쇄합니다. - p 옵션을 입력하면 사람의 이름을 출력하고, 또한 - h 옵션을 입력하면 도움말 옵션을 출력할 수 있습니다.코드 파일과 상응하는 화면 입력과 출력을 살짝 본 다음에 어떻게 발생하는지 다시 한 번 봅시다.
//hello.cpp 
#include <iostream>
#include <string>
#include <boost/program_options.hpp>

using namespace std;
int main(int argc, char* argv[])
{
    using namespace boost::program_options;
    //       
    options_description desc("Allowed options");
    desc.add_options()
        ("help,h", "produce help message")
        ("person,p", value<string>()->default_value("world"), "who")
        ;

    variables_map vm;        
    store(parse_command_line(argc, argv, desc), vm);
    notify(vm);    

    if (vm.count("help")) {
        cout << desc;
        return 0;
    }
    cout << "Hello " << vm["person"].as<string>() << endl;
    return 0;
}

다음은 Windows 명령 프롬프트 창의 입력 출력 결과입니다. 여기서 ">"는 프롬프트를 나타냅니다.
>hello 
Hello world

>hello -h
Allowed options:
  -h [ --help ]                produce help message
  -p [ --person ] arg (=world) who

>hello --person len
Hello len

우선 options를 통해description 클래스는 필요한 옵션을 설명합니다.addoptions는operator () 를 정의한 특수한 프록시 대상을 되돌려줍니다.이 호출은 보기에 좀 이상하다. 매개 변수는 옵션 이름, 옵션 값, 그리고 옵션에 대한 설명 순이다.예시된 옵션 이름이 "help, h"인 것을 알 수 있습니다. 짧은 항목 이름과 긴 항목 이름이 있는 옵션을 설명했기 때문에gnu 프로그램의 명령줄과 일치합니다.물론 너는 짧은 선택 항목의 이름을 생략할 수 있지만, 이렇게 하면 명령 옵션으로 간략하게 쓸 수 없다.두 번째 옵션의 설명은 옵션 값을string 형식으로 정의하고 기본값은world입니다.
다음으로variablesmap류의 대상은 주로 옵션 값을 저장하고 임의의 형식의 값을 저장할 수 있습니다.그리고,store,parsecommand_line과 notify 함수는 vm가 명령줄에서 발견한 옵션을 저장할 수 있도록 합니다.
마지막으로 우리는 이 옵션들을 자유롭게 사용할 것이다.variables맵 클래스의 사용은 std::map을 사용하는 것과 같습니다. 맵을 제외하고는 as 방법으로 값을 가져와야 합니다.만약 as 방법이 호출한 지정된 유형이 실제 저장된 유형과 다르면 이상 투매가 발생할 수 있습니다.
프로그래밍을 한 당신은 cl나 gcc를 사용하여 원본 파일을 컴파일할 때 원본 파일 이름을 명령줄에 직접 놓을 수 있으며, 예를 들어 gcc a.c 같은 옵션 자모는 필요 없습니다.prgram_options도 이런 상황을 처리할 수 있다. 라이브러리에서'positional options' (위치 옵션) 라고 불리지만, 이것은 프로그래머의 약간의 도움을 받아야만 완성할 수 있다.아래의 수정된 코드를 보면 우리는'-p'옵션을 전송하지 않아도'person'옵션 값을 지정할 수 있다
    positional_options_description p;
    p.add("person", -1);
    store(command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
>hello len
Hello len

앞에 추가된 두 줄은 모든 위치 옵션이'person'옵션으로 해석되어야 한다는 것을 설명하기 위해서이며, 여기는command 을 사용했습니다.line_parser 클래스는 Parse 대신 명령줄을 해석합니다.command_라인 함수.후자는 전자 클래스에 대한 간단한 봉인일 뿐이지만, 현재 우리는 추가 정보를 전달해야 하기 때문에 클래스 자체를 사용해야 한다.
옵션 복합 소스
일반적으로 명령줄에 모든 옵션을 지정하는 것은 사용자에게 매우 짜증스럽다.만약 어떤 옵션이 매번 실행에 적용되려면 어떻게 해야 합니까?우리는 당연히 자주 사용하는 설정이 있는 옵션 파일을 만들어서 명령줄과 함께 프로그램에 적용하기를 희망한다.물론 이 모든 것은 명령줄과 설정 파일의 값을 결합시켜야 한다.예를 들어 명령줄에서 지정한 일부 옵션 값은 설정 파일의 대응하는 값을 덮어쓰거나 조합할 수 있어야 한다.
다음 코드 세그먼트는 옵션을 파일에서 읽습니다. 이 파일은 텍스트 형식입니다.'#'으로 주석을 표시할 수 있습니다. 형식은 명령줄의 매개 변수와 같고 옵션=값입니다.
    ifstream ifs("config.cfg");
    store(parse_config_file(ifs,config),vm);
    notify(vm);

참고 자료
Boost.prgram_options 라이브러리 문서
2) clpp
'Command line parameters parser' library provides parsing of command line parameters, with callback corresponding functions and, if necessary, checking of parameter's values semantic.This library is licensed under LGPL, which means that you can use it for commercial and non-commercial purposes.
Simplest example of CLPP using:
 #include <clpp/parser.hpp>

 #include <iostream>
 
 void help() {
     std::cout << "My program, version 1.0. Common usage is..." << std::endl;
     //
 }
 
 int main( int argc, char* argv[] ) {
     clpp::command_line_parameters_parser parser;
     // Register parameter, without value and without any checking...
     parser.add_parameter( "-h", "--help", help );
     try {
         parser.parse( argc, argv );
         // If user inputs '-h' or '--help' in command line, function 'help()' will be called.
     } catch ( const std::exception& exc ) {
         std::cerr << exc.what() << std::endl;
     }
 
     return 0;
 } 

You can download CLPP source code from SourceForge.
참고 자료http://www.cnblogs.com/MikeZhang/archive/2012/09/07/argsTest20120907.html
http://www.cppblog.com/len/archive/2008/06/15/53368.aspx

좋은 웹페이지 즐겨찾기