2014-07-04 1 views
1

명령 줄에서 더 많은 인수를 가져 와서 새로운 줄마다 각 인수를 출력하도록하고 싶습니다. 같은 구조를 유지하면 어떻게 될까요? 나는 또한 -f 출력을 얻고 싶다. 코멘트에서getopt를 통해 몇 가지 인수 전달하기

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <getopt.h> 

int 
main(int argc, char *argv[]) 
{ 
    int nod1, opt; 
    int nsecs, nod2; 

    nsecs = 0; 
    nod2 = 0; 
    nod1 = 0; 

    while ((opt = getopt(argc, argv, "nf:")) != -1) { 
     switch (opt) { 
     case 'n': 
      nod1 = 1; 
      break; 
     case 'f': 
      nsecs = atoi(optarg); 
      nod2 = 1; 
      break; 
     default: /* '?' */ 
      fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n", 
        argv[0]); 
      exit(EXIT_FAILURE); 
     } 
    } 

    printf("nod1=%d; nod2=%d; optind=%d\n", nod1, nod2, optind); 

    if (optind >= argc) { 
     fprintf(stderr, "Expected argument after options\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("Output = %s\n", argv[optind]); 

    /* Other code omitted */ 

    exit(EXIT_SUCCESS); 
} 

다음 -f

인수는 선택해야하며, 내가 서로에서 통과 된 모든 하나 하나를 나열 할 ...

$ ./partitioner -n 4 -f Test1 Test2 Test3 Test4 
Number:4 
File names: 
Output = Test1 
Output = Test2 
Output = Test3 
Output = Test4 
$ 
+0

내가보고 한 후 올바른 사용법 메시지를 포함하는 것이 좋습니다 '옵션 뒤에 예상되는 인수'와 같은 윙윙 거리기. 사람들이 올바른 사용법을 얻는 데 도움이됩니다. 사용법 메시지 ('-t'에 언급)가'getopt()'가 기대하는 것과 일치하면 ('-f') 좋은 아이디어입니다. –

+0

POSIX ['getopt()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getopt.html)는 선택적 인수를 현명하게 처리하지 않습니다. GNU'getopt()'는 조금 낫지 만 많이 사용하지는 않습니다. 가능한 한 언제나 피하십시오. 주석에서 복사 한 샘플 사용법은 '-f'와'-t' 문제가 해결 되더라도 사용법과 일치하지 않습니다. 인수가없는'-n' 뒤에 인수'4'가 있습니다. 클래식 (POSIX)'getopt()'에서는 옵션을 종료합니다. GNU'getopt()'는 환경에 POSIXLY_CORRECT가 없거나 올바른 표시를 사용하여 옵션을 시작하지 않는 한 옵션과 인수를 변경합니다. –

+0

현재, 나는 당신이 무엇을 요구하고 있는지 '가까이 - 불분명하다'라고 투표했습니다.당신이 달성하기를 원하는 것을 분명히하고 나면 다시 생각해보고 (그리고이 주석을 제거한) 나에게 (@ 조나단) 나에게 의견을 말하십시오. –

답변

0

조나단 Leffler에 의해 만들어진 의견을 내 대답을 편집 :

POSIX getopt()는 선택적 인수를 현명하게 처리하지 않습니다. GNU getopt()는 조금 낫지 만 많이는 아닙니다. 가능한 한 언제나 피하십시오. 문제를 해결할 수

나는 간단한 아이디어로 나올

, 그러나 사람은 그래서 여기있다 : argv에서

당신은 그들이 표창 라인 오른쪽 있다는 주문 인수 목록이 있습니까? 따라서 -fargv에 있으면 다른 옵션이나 인수 목록의 끝이 인쇄 할 옵션이 될 때까지 -f 다음의 모든 인수를 의미합니다. 또 다른 옵션 -f에서

(이 경우 -g) :

./command는 한 두 개의 나무 -f -b의 B -g G -f에서

을 -a 끝까지.

./command

은 -f -b의 B를 -a 한 두 개의 나무 여기

해당 작업을 수행하는 도우미 함수가 : 여기

bool get_f_args(int argc, char *argv[], int &count, int* indexes) 
{ 
    bool f_found = false, parsing_f_args = false; 
    int collect_count = 0; 

    if (argc < 3) return false; // "./command -f" are just two values for argv 
           // we need at least 3. 

    // Check for every argument in the argument list. 
    for (int i = 1; i < argc; i++) 
    { 

     // If you found another option 
     // stop collecting args. 
     if (argv[i][0] == '-' && parsing_f_args) // options starts with '-' character. 
      parsing_f_args = false; 

     if (parsing_f_args) 
      indexes[count++] = i; 

     // If some is "-f" then the following are the 
     // ones you're looking for. We check for -f after 
     // 
     // indexes[count++] = i; 
     // 
     // in roder to avoid adding -f index to indexes. 
     if (strcmp("-f", argv[i]) == 0) { 
      parsing_f_args = true; 
      f_found = true; 
     } 

    } 
    return f_found; 
} 

그리고이 예입니다 사용의 :

int main(int argc, char* argv[]) 
{ 
    int count = 0; 
    int indexes[10]; 

    bool f_found = get_f_args(argc, argv, count, indexes); 
    if (f_found){ 
     for (int i = 0; i < count; i++) 
      printf("Ouput = %s\n", argv[indexes[i]]); 
    } 

    return 0; 
} 
+0

-f 뒤에 오는 인수는 선택적이어야하며 서로 넘겨받은 모든 단일 목록을 나열하고 싶습니다 ... [valentin @ rpmbuild partitioner] $ ./partitioner -n 4 -f Test1 Test2 Test3 테스트 4 가되어야한다 수 : 4 파일 이름 : 출력 = Test1을 출력 = Test2를 출력 = 테스트 3 출력이 = TEST4 – Mihov

+0

대답 편집, 난이 도와 주길 바래요. –

관련 문제