2017-11-28 12 views
1

여러 인수를 사용할 수있는 C 프로그램이 있습니다. 여기에는 데이터 저장소와 디스크 모두에 공통 플래그 d이 있습니다. d으로 확인하기 전에 깃발을 순서대로 확인하고 store 값을 얻을 수있는 방법이 있습니까? 나는 s를 확인하고이 루프 등C에 공통 플래그가있는 구문 분석 옵션

static void 
ParseOptions(int argc, char* argv[]) 
{ 
    int c, option_index; 
    int ind = 0; 

    while((c = getopt_long(argc, argv, "s:d:", 
          long_options, &option_index))!= -1) { 
     ind = optind; 
     switch(c) { 
     case 's': 
      optionStore = true; 
      store = strdup(optarg); 
      break; 
     case 'd': 
      if(strcmp(store,"datastore") == 0){ 
       printf("In datastore\n"); 
       datastore = strdup(optarg); 
      } 
      else if(strcmp(store,"disk") == 0){ 
       printf("In disk\n"); 
       disk = strdup(optarg); 

      }    
      break; 
     default: 
      exit(-1); 
     } 
    } 
} 

이것에 대해 이동하는 방법을 확실하지를 입력하려면이 전에 잠시 루프를 추가하는 등 다양한 방법을 시도했습니다.

+0

가능한 중복 특정 순서?] (https://stackoverflow.com/questions/26473642/can-i-use-getopt-to-process-options-in-a-aqu-order) –

+0

'case'에 플래그를 설정합니다. ':'와''d':'주 '에서 테스트하십시오 :'주의 :''d'가있을 때''s ''가 존재할 필요가 없으므로이 플래그에 대해 가능한 세 개의 ** ** 값이 있습니다. 본. – joop

+1

모두 구문 분석을 마친 후에 호환성 옵션을 확인하십시오. –

답변

1

당신은 임시 변수에 플래그 d에 대해 반환 optarg를 저장하고, 루프가 설정 종료 후를 사용해야 하나 disk 또는 datastore :

char *temp_disk_or_datastore; 
while((c = getopt_long(argc, argv, "s:d:", 
         long_options, &option_index))!= -1) { 
    ind = optind; 
    switch(c) { 
     case 's': 
      optionStore = true; 
      store = strdup(optarg); 
      break; 
     case 'd': 
      temp_disk_or_datastore = strdup(optarg);  
      break; 
     default: 
      exit(-1); 
    } 
} 
if (store == NULL) { 
    printf("Missing storage option"); 
    exit(-1); 
} 
if(strcmp(store,"datastore") == 0){ 
    printf("In datastore\n"); 
    datastore = temp_disk_or_datastore; 
} 
else if(strcmp(store,"disk") == 0){ 
    printf("In disk\n"); 
    disk = temp_disk_or_datastore; 
}  
내가에서 옵션을 처리하는 것은 getopt를 사용할 수 [의
+0

나는이 솔루션에 작은 문제에 직면했다. 명령 줄에서 플래그를 제공 할 때 플래그의 순서를 교환 할 수 없습니다. 현재로서는''''''을 전달해야합니다. 그 후에''''''을 전달하면 코드가 제대로 작동합니다. 그렇지 않으면 코드가''잘못된 옵션''오류로 끝나고'''세분화 오류''로 연결됩니다. 내가 이것을 피할 수있는 방법이 있을까요? – nidHi

+0

@nidHi'getopt_long'은 상태를 정적으로 유지한다는 것을 몰랐습니다. 나는 그것을 설명하기위한 답을 다시 썼다. – dasblinkenlight

+0

감사합니다. @dasblinkenlight! 그게 나를 위해 일한 ... – nidHi