2016-09-13 5 views
-1

해시 테이블 프로그램이 있는데 명령 줄 옵션 입력을 구현하려고합니다. 기본 동작은 해시 테이블을 만들고 텍스트 파일로 읽는 것입니다.이 작업은 옵션을 확인한 후에 수행됩니다. 옵션은 대개 생성 전에 해시 테이블의 속성을 변경합니다. 예를 들어 -f 옵션은 테이블 크기를 지정합니다.C에서 명령 줄 옵션 사용

예컨대 ./program < words.txt -f 400

나는 현재이처럼 취급 해요 :

int main(int argc, char*argv[]){ 

    const char *optstring = "e:f:"; 
    char option; 
    int tablesize = 100; 
    int unknown_words, i; 
    char word[256]; 
    htable h; 
    default = 1; 

    while((option = getopt(argc, argv, optstring)) != EOF){ 
     switch (option){ 

      case 'e': 
       default = 0; 
       h = htable_new(tablesize); 

       copy_in(h); 

       unknown_words = find_words(h, optarg); 
       printf("%d", unknown_words); 
       break; 

      case 'f': 

       if(optarg && atoi(optarg)>0){ 
        tablesize = atoi(optarg);   
       } 
       break; 
     } 
    } 

    if(default==1){ 
     h = htable_new(tablesize); 
     copy_in(h); 
     print_stats(h); 
    } 
    } 

내 문제는 내가 어떤 순서로 이러한 플래그/옵션을 입력 할 것입니다. 인수 (두 번째 텍스트 파일의 이름)를 취하는 -e 옵션이 있습니다. 해시 테이블을 만들고 첫 번째 텍스트 파일을 읽으면 (기본 작업과 같은) 두 번째 파일의 단어에 대한 해시 테이블을 검색하고 알 수없는 단어 수를 인쇄합니다. 또한 기본값이 아닌 다른 테이블 크기를 사용하도록 지정하는 -f 옵션이 있습니다. 아래 명령을 실행하면 예상되는 동작이 발생합니다.

./program < words.txt -f 350 -e other_words.txt 

-f 옵션

먼저 발견되고, 테이블 크기 변수 -e 옵션은 다음을 발견하고 업데이트 된 값을 사용하여 수행된다 (350)에 지정된 기본 값으로부터 변화된다. 같은 원하는 동작과 다른 순서로 그러나

:

./program < words.txt -e other_words.txt -f 350 

-e 옵션 만 나중에 기본 테이블의 크기에 실시되고는하지 -f 옵션을 발견하고 테이블 크기가 변화하고있다 익숙한.

나는 아래 작업을 수행했지만 비효율적으로 보입니다. 기본적으로 -e 옵션을 찾으면 나머지 옵션을 반복하여 먼저 수행하십시오. 이것은 각각의 관련 옵션에 대한 중복 코드를 의미하지만 나는 이것을 어떻게 다룰 것인지 궁금합니다.

while((option = getopt(argc, argv, optstring)) != EOF){ 
     switch (option){ 

      case 'e': 
       default = 0; 
       for(i=optind;i<argc;i++){ 
        if(strcmp(argv[i],"-t") == 0){ 
         if(argv[i+1] && atoi(argv[i+1])>0){ 
          tablesize =atoi(argv[i+1]); 
         } 
        } 
       } 


       h = htable_new(tablesize); 

       copy_in(h); 

       unknown_words = find_words(h, optarg); 
       printf("%d", unknown_words); 
       break; 

      case 'f': 

       if(optarg && atoi(optarg)>0){ 
        tablesize = atoi(optarg);   
       } 
       break; 
     } 
    } 
+1

안녕하세요. 오버플로 스택 오버플로입니다. 코드를 줄이는 방법에 대해 [mcve]를보고 자신의 요구 사항을보다 명확하게 설명하십시오. –

+1

기술적으로 거기에 질문이 없었습니다. 그 아름다운 박람회가 끝나면 우리가 추측을하지 말고 구체적인 것을 묻지 마십시오. –

+1

주문이 중요 할 경우 먼저 모든 인수를 수집해야하며 모든 코드가 있으면 각각의 코드를 실행하십시오. 옵션'f'가'tablesize'를 설정하면 (예 : -1과 같이 발생할 수없는 것으로 초기화합니다.) 옵션'e'가 있으면 파일 이름을 어딘가에 넣습니다 (예 : NULL로 초기화). 옵션 루프가'tablesize! = -1'를 체크하고 그 크기를 설정 한 후에'filename! = NULL'을 체크하고 그 파일을 작업하십시오. – deamentiaemundi

답변

3

일반적인 접근 방식은 옵션 처리기에서 실제 작업을 수행하지 않습니다. 대신 각 처리기가 옵션이 지정되었는지 (그리고 인수가 무엇인지) 추적하도록 변수를 설정하게하십시오. 그런 다음 모든 명령 행 옵션을 구문 분석 한 후 원하는 순서대로 처리 할 수 ​​있습니다. 예를 들면 다음과 같습니다.

const char* filename = NULL; 
int tablesize = 0; 

while ((option = getopt(argc, argv, optstring)) != EOF) { 
    switch (option) { 
     case 'e': 
      filename = optarg; 
      break; 

     case 'f': 
      if (optarg && atoi(optarg) > 0) { 
       tablesize = atoi(optarg);   
      } 
      break; 
    } 
} 

if (filename != NULL) { 
    default = 0; 
    h = htable_new(tablesize); 

    copy_in(h); 
    unknown_words = find_words(h, filename); 
    printf("%d", unknown_words); 
}