다양한 명령 줄 인수를 취하는 프로그램이 있습니다. 단순화를 위해 3 개의 플래그가 필요하다고 말할 것입니다.
-a
및
-b
, 다음 코드를 사용하여 내 인수를 구문 분석하십시오.
-c
참고 : a 및 b는 플래그 뒤에 매개 변수를 사용합니다.
하지만 프로그램을 호출하면 문제가 발생합니다
int c;
while((c = getopt(argc, argv, ":a:b:c")) != EOF)
{
switch (c)
{
case 'a':
cout << optarg << endl;
break;
case 'b':
cout << optarg << endl;
break;
case ':':
cerr << "Missing option." << endl;
exit(1);
break;
}
}
여기서 parameterForA를 잊어 버린 경우 parameterForA (optarg로 표시)는
./myprog -a -b parameterForB
로 반환됩니다.
parameterForB는 매개 변수가없는 옵션으로 간주되며 optind는 argv에서 parameterForB의 색인으로 설정됩니다.
-b
입니다.
':'
에 대한 인수가 없으면 리턴됩니다.
및
-a
표준 오류로 인쇄됩니다. 그러나 그것은
Missing option.
경우에만 발생합니다
프로그램에 마지막으로 전달 된 매개 변수입니다.
질문은 다음과 같습니다.
-a
를 만드는 방법이 있습니까?
getopt()
로 시작하는 옵션이 없다고 가정
?
-
- 답변 # 1
- 답변 # 2
C ++로 작업하는 경우 boost :: program_option은 명령 줄 인수를 구문 분석하는 것이 좋습니다.
부스트 :: program_options 라이브러리
- 답변 # 3
전체 공개 : 저는이 문제에 대해 전문가가 아닙니다.
gnu.org의이 예제를 사용할 수 있습니까? '?'를 처리하는 것 같습니다 예상 인수가 제공되지 않은 경우 문자 :
*optarg
업데이트 :아마도 다음과 같은 해결책이 있습니까?
optind
- 답변 # 4
부스트 프리 프로젝트의 대안으로
int c, prev_ind; while(prev_ind = optind, (c = getopt(argc, argv, ":a:b:c")) != EOF) { if ( optind == prev_ind + 2 && *optarg == '-' ) { c = ':'; -- optind; } switch ( …
를위한 간단한 헤더 전용 C ++ 래퍼가 있습니다. (BSD 3-Clause 라이센스하에) : https://github.com/songgao/flags.hhwhile ((c = getopt (argc, argv, "abc:")) != -1) switch (c) { case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': cvalue = optarg; break; case '?': if (optopt == 'c') fprintf (stderr, "Option -%c requires an argument.\n", optopt); else if (isprint (optopt)) fprintf (stderr, "Unknown option `-%c'.\n", optopt); else fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); return 1; default: abort (); }
에서 가져온저장소에서 :
while((c = getopt(argc, argv, ":a:b:c")) != EOF) { if (optarg[0] == '-') { c = ':'; } switch (c) { ... } }
- 답변 # 5
getopt
에는 상당히 다른 버전이 있습니다 한 버전에서 작동하도록해도 해결 방법이 중단 될 수있는 다른 버전이 5 개 이상있을 수 있습니다. getopt를 사용해야하는 압도적 인 이유가 없다면 Boost.Program_options와 같은 다른 것을 고려할 것입니다.example.cc
관련 자료
- java - Project Loom 기술을 런타임에 누락되거나 존재하는 JVM으로 감지
- python - oserror - [errno 22] 잘못된 인수 (파일을 처리하는 동안 무작위로 실패)
- javascript - call_button ()에 필수 위치 인수 1 개가 없습니다 - 'method'odoo
- javascript - 오류가 발생했습니다 - "인수 목록 다음에 누락"
- r - ezANOVA에서 기본값이없는"x"인수가 누락되었습니다
- javaScript function - 자바 스크립트 기능 - 왜 내 기본 논증이 실패합니까?
- angular - npm start (ng serve) 'syntaxerror - missing) 인수 목록 뒤에'창만 실행할 때 오류가 발생
- javascript - 구텐베르크 블록 검증 실패 (속성 누락)
- python - typeerror - rook ()에 필수 위치 인수 1 개가 없습니다 : 'self'
- f# - Argu에서 선택적 매개 변수로 보이는 것에 대한 인수 오류 누락
- build - / bin/sh - 0에서 도커 실행이 실패합니다 -c에는 인수가 필요합니다
- javascript - xpath 다음에 인수 목록 뒤에 syntaxerror - missing)
- uipath - 파일 경로를 입력 인수로 Orchestrator API StartJobs에 전달할 때 유효성 검증이 실패 함
- python - 이 누락 된 필수 위치 인수 오류 1 개를 강조하지 마십시오
- if statement - 피쉬 - 오류 인 경우 :`[: 인덱스 2에 인수가 없습니다`
- python - 함수에 필요한 위치 인수 1 개가 누락되었습니다
- ajax - CSRF 토큰이 없거나 유효하지 않습니다 -> 첫 번째 양식은 다른 CSRF 토큰 작업에 실패합니다
- java - PDF에서 누락/손상된 유니 코드 매핑 감지
- javascript - 인수 목록 뒤에)가없는 이유가 보이지 않습니까?
- swift - 호출에서 매개 변수 'item'에 대한 인수가 누락되었습니다
- c++ : Autotools 라이브러리용 libfuzzer 생성
- c++ : cmake 빌드 .so 라이브러리
- c++ : "심층" 헤더 종속성 분석
- c++ : #.h 또는 .c /.cpp에 포함?
- c++ : 구조체를 반환하는 extern "C" 함수가 예기치 않게 작동합니다.
- c++ : mql4에 맨 위 따옴표를 추가하십시오. 그런 다음 이 목록 구성원을 사용하여 주문을 엽니다. 하지만 주문 형식을 할 수 없습니다
- java : 오류 ld 1로 인해 CodeBlock의 프로젝트를 빌드할 수 없습니다.
- c : `getopt_long`을 사용할 때 `option long_options[]` 이해하기
- c++ : 실행 파일을 컴파일하는 데 사용된 컴파일러를 확인하는 방법은 무엇입니까?
- c++ : 합산 및 스와핑 기능을 수행하지만 스와핑 부분, 첫 번째 숫자는 합산 값을 취하고 다른 숫자는 값 1
getopt
에 대한 POSIX 표준 정의를 참조하십시오 .그 탐지에 관해서는
와이즈 비즈와이즈 비츠 같아 원하는 것을 수행하지 않기 위해 정의되었으므로 직접 확인을 구현해야합니다. 다행히도
를 검사하여 그렇게 할 수 있습니다 그리고 를 변경 너 자신.