getopt () 사용법 설명
8684 단어 get
#include <unistd.h>
extern char *optarg; //
extern int optind, // getopt , optind 。
extern int opterr, // opterr=0 ,getopt stderr 。
extern int optopt; // optstring , optopt ,getopt '?’、
int getopt(int argc, char * const argv[], const char *optstring);
한 번 호출하고 옵션을 되돌려줍니다.명령줄 옵션 파라미터가 더 이상 옵션string에 포함된 옵션을 검사하지 못할 때, 1 을 되돌려주고, 옵션이 없는 첫 번째 명령줄 파라미터를 저장합니다.
먼저 옵션이 무엇인지, 파라미터가 무엇인지 말해 보세요.
문자열optstring은 다음 요소를 사용할 수 있습니다.단일 문자, 표현 옵션, 2.단일 문자 뒤에 콜론이 붙습니다. 이 옵션을 선택한 후에 반드시 매개 변수를 따라야 한다는 것을 나타냅니다.매개변수는 옵션 바로 뒤에 있거나 공백으로 구분됩니다.이 매개 변수의 바늘은optarg에 부여됩니다.3 단일 문자 뒤에 두 개의 콜론이 붙습니다. 이것은 이 옵션을 선택한 후에 반드시 매개 변수를 따라야 한다는 것을 의미합니다.매개변수는 옵션 바로 뒤에 있어야 하며 공백으로 구분할 수 없습니다.이 매개 변수의 바늘은optarg에 부여됩니다.(이 특성은 GNU의 확장이다).
optstring = "ab:c:::d:::"와 같은 명령행 인자를 '-' 로 시작하는 getopt에서 처리합니다. 명령행은 getopt입니다.exe -a -b host -ckekeke -d haha는 이 명령행 매개 변수에서 -a와 -h는 옵션 요소입니다.'-'를 제거하고 a, b, c는 옵션입니다.host는 b의 매개 변수,keke는 c의 매개 변수입니다.그러나haha는 d의 매개 변수가 아니다. 왜냐하면 중간에 빈칸이 있기 때문이다.
또한 기본적으로 Getopt는 명령행 매개 변수의 순서를 다시 배열하기 때문에 마지막에 옵션이 포함되지 않은 명령행 매개 변수는 끝까지 배열합니다.getopt와 같습니다.exe -a ima -b host -ckekeke -d haha, 모두 마지막 명령행 매개 변수 순서: -a -b host -ckekeke -d ima haha optstring의 문자열이'+'플러스로 시작하거나 환경 변수 POSIX LYCORRE가 설정됩니다.옵션이 없는 명령행 인자를 만나면 Getopt가 멈추고 -1로 돌아갑니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int result;
opterr = 0; // getopt stderr
while( (result = getopt(argc, argv, "ab:c::")) != -1 )
{
switch(result)
{
case 'a':
printf("option=a, optopt=%c, optarg=%s
", optopt, optarg);
break;
case 'b':
printf("option=b, optopt=%c, optarg=%s
", optopt, optarg);
break;
case 'c':
printf("option=c, optopt=%c, optarg=%s
", optopt, optarg);
break;
case '?':
printf("result=?, optopt=%c, optarg=%s
", optopt, optarg);
break;
default:
printf("default, result=%c
",result);
break;
}
printf("argv[%d]=%s
", optind, argv[optind]);
}
printf("result=-1, optind=%d
", optind); // optind
for(result = optind; result < argc; result++)
printf("-----argv[%d]=%s
", result, argv[result]);
// , 。
for(result = 1; result < argc; result++)
printf("
at the end-----argv[%d]=%s
", result, argv[result]);
return 0;
}
unistd에optind 변수가 있습니다. getopt가 있을 때마다 이 인덱스는argv에서 현재 분석하고 있는 문자열의 다음 인덱스를 가리킵니다. 따라서argv[optind]는 다음 문자열을 얻을 수 있습니다. '-' 로 시작하는지 판단하면 됩니다.다음은 테스트 프로그램입니다.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int tmp = 4;
while( (tmp = getopt(argc, argv, "abck")) != -1 )
{
printf("-%c\t", tmp);
int opt = optind ;
while( opt < argc )
{
if ( argv[opt][0] != '-' )
{
printf("%s\t", argv[opt]);
opt ++;
}
else
break;
}
printf("
");
}
getchar();
}
명령줄 파라미터를 분석하는 데 사용되는 getopt () 를 설명합니다.매개 변수argc와argv는main()에서 전달하는 매개 변수의 개수와 내용입니다.매개 변수optstring은 처리할 옵션 문자열을 나타냅니다.이 함수는argv의 다음 옵션 자모를 되돌려줍니다. 이 자모는 매개 변수optstring의 자모에 대응합니다.만약 옵션 문자열의 알파벳 뒤에 ':' 이라는 사칭이 붙으면 관련 매개 변수가 있음을 나타냅니다. 전역 변수optarg는 이 추가 매개 변수를 가리킵니다.getopt () 에서 일치하는 인자를 찾지 못하면 오류 정보를 인쇄하고 전역 변수optopt를 "?"로 설정합니다.문자, getopt () 에서 잘못된 정보를 인쇄하지 않으려면, 전역 변수opterr를 0으로 설정하면 됩니다.
반환값 일치하는 매개 변수를 찾으면 이 매개 변수 자모를 되돌려주고, 매개 변수optstring에 포함되지 않은 매개 변수 자모를 되돌려줍니다. "?"문자, 분석이 끝나면 -1을 반환합니다.
예제
#include<stdio.h>
#include<unistd.h>
int main(int argc,char **argv)
{
int ch;
opterr = 0;
while((ch = getopt(argc,argv,”a:bcde”))!= -1)
switch(ch)
{
case ‘a’:
printf(“option a:’%s’
”,optarg);
break;
case ‘b’:
printf(“option b :b
”);
break;
default:
printf(“other option :%c
”,ch);
}
printf(“optopt +%c
”,optopt);
}
$./실행getopt –b
option b:b
$./getopt –c
other option:c
$./getopt –a
other option :?
$./getopt –a12345
option a:’12345’
getopt 함수
함수 정의:
#include
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
#define _GNU_SOURCE
#include
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts,
int *longindex);
int getopt_long_only(int argc, char * const argv[],
const char *optstring,
const struct option *longopts,
int *longindex);
getopt () 함수는 명령행 인자를 해석하는 데 사용됩니다.여기, 주로 Getoptlong().
getopt_롱()의 두 번째 매개 변수,argc와argv는 각각main()에 전달되는 매개 변수의 개수와 매개 변수 수조(main()의argc와argv는 하나의 개념)이다.
getopt_long ()에서 optstring은 받아들일 수 있는 인자를 나타내는 문자열입니다.예를 들어'a:b:cd'는 받아들일 수 있는 파라미터가 a, b, c, d라는 것을 나타낸다. 그 중에서 a와 b 파라미터 뒤에 있다.
에 더 많은 매개변수 값이 있습니다.(예: -a host --b name)
getopt_long()에서 매개변수 longopts는 구조의 인스턴스입니다.
struct option {
const char *name;
//name
int has_arg;
//has_arg 3 ,no_argument( 0),
// required_argument( 1),
// optional_argument( 2), ,
int *flag;
// ,getopt_long() 。 flag null, option val
int val;
// flag
}
예를 들면 다음과 같습니다.
struct option long_options[] = {
{"a123", required_argument, 0, 'a'},
{"c123", no_argument, 0, 'c'},
}
현재 명령줄의 매개 변수가 -a123이면 getopt 를 호출합니다long () 은 문자 'a' 를 되돌려주고 문자열 123을optarg에서 되돌려줍니다. (주의! 문자열 123은optarg에서 가져옵니다.
돌아가다optarg는 정의할 필요가 없습니다. getopt에 있습니다.h에 정의되어 있음) 명령행 인자가 -c이면 getoptlong () 은 문자 'c' 를 되돌려줍니다. 이 때optarg는null입니다.
마지막으로 Getoptlong()은 명령줄의 모든 매개 변수를 분석한 후 -1을 되돌려줍니다.
보아하니 내가 말한 것이 좀 혼란스러운 것 같다. 그러면 예를 들어 나는 코드가 문제를 가장 잘 설명할 수 있다고 믿는다.
#include
#include
#include #include #include #include
int main( int argc, char **argv ) {
struct option long_options[] = { {"a123", required_argument, 0, 'a'}, {"c123", no_argument, 0, 'c'}, } int opt; printf("starting... "); while((opt = getopt_long(argc, argv, "a:c", long_options, NULL)) != -1) { switch (opt) { case 'a': printf("It's a! "); printf("string of a:%s ",optarg); break; case 'c': printf("It's c! "); break; default: printf("You should look for help! "); exit(1); break; } } printf("end... "); return 0; }
#include
#include
int main( int argc, char **argv )
{
struct option long_options[] = {
{"a123", required_argument, 0, 'a'},
{"c123", no_argument, 0, 'c'},
}
int opt;
printf("starting... ");
while((opt = getopt_long(argc, argv, "a:c", long_options, NULL)) != -1)
{
switch (opt)
{
case 'a':
printf("It's a! ");
printf("string of a:%s ",optarg);
break;
case 'c':
printf("It's c! ");
break;
default:
printf("You should look for help! ");
exit(1);
break;
}
}
printf("end... ");
return 0;
}
컴파일 후 a.out을 생성한다고 가정하면 시험해 볼 수 있습니다.a.out -a hello -c 출력: starting...It's a! string of a:hello It's c! end...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java get 요청과post 요청 예시 보내기텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.