명령행 매개변수 해석
헤더 파일: #include
#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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.