해시 테이블 프로그램이 있는데 명령 줄 옵션 입력을 구현하려고합니다. 기본 동작은 해시 테이블을 만들고 텍스트 파일로 읽는 것입니다.이 작업은 옵션을 확인한 후에 수행됩니다. 옵션은 대개 생성 전에 해시 테이블의 속성을 변경합니다. 예를 들어 -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;
}
}
안녕하세요. 오버플로 스택 오버플로입니다. 코드를 줄이는 방법에 대해 [mcve]를보고 자신의 요구 사항을보다 명확하게 설명하십시오. –
기술적으로 거기에 질문이 없었습니다. 그 아름다운 박람회가 끝나면 우리가 추측을하지 말고 구체적인 것을 묻지 마십시오. –
주문이 중요 할 경우 먼저 모든 인수를 수집해야하며 모든 코드가 있으면 각각의 코드를 실행하십시오. 옵션'f'가'tablesize'를 설정하면 (예 : -1과 같이 발생할 수없는 것으로 초기화합니다.) 옵션'e'가 있으면 파일 이름을 어딘가에 넣습니다 (예 : NULL로 초기화). 옵션 루프가'tablesize! = -1'를 체크하고 그 크기를 설정 한 후에'filename! = NULL'을 체크하고 그 파일을 작업하십시오. – deamentiaemundi