2015-01-27 17 views
1

기본적으로 입력 a와 b 다음에 숫자를 찾고 있는데 추가 정보없이 c와 d를 찾고 있습니다. 그러나 getopt를 사용하여이 작업을 수행하려고하면 루프가 실행되지 않습니다.getopt를 사용하여 C에서 입력 내용을 구문 분석하려고 시도했습니다.

컴파일
int aa = 0; 

int av = 0; 

int ab = 0; 

int bv = 0; 

int ac = 0; 

int cord = 0;// no c or d = 0, c = 1, d = 2 

//flags and a/b value holders 

int getoptvalue = 0; 

printf("starting getopt\n"); 

while((getoptvalue = getopt(argc,argv,"cda:b:")) != -1){ 

printf("inside getopt\n"); 

    switch(getoptvalue){ 

    case a:if(aa||ab){ 

     exit(1); 

     } 

     else{ 

     aa = 1; 

     av = atoi(optarg);//takes int value following 'a' for storage in av? 

     }break; 

    case b:if(ab){ 

     exit(1); 

     } 

     else{ 

     ab = 1; 

     bv = atoi(optarg);//takes following int value for storage? 

     }break; 

    case c:if(ac){ 

     exit(1); 

     } 

     else{ 

     ac = 1;//c/d switch 

     cord = 1; // showing c was reached 

     }break; 

    case d:if(ac){ 

     exit(1); 

     } 

     else{ 

     ac = 1; 

     cord = 2; //showing d was reached 

     }break; 

    default: break; 

    } 

printf("done.\n"); 

} 

,이 코드를 인쇄 :

$ PROG1의 A1 B2를 수행 getopt는 을 시작하는 몇 가지 예제 코드입니다.

분명히 "getopt 내부"를 인쇄하지 않기 때문에 루프를 실행하지 않고 있지만 그 이유는 알 수 없습니다. 어떤 아이디어?

+1

내가 뭔가를 누락하면 내가 미안하지만, 그것은 'case a'인가 'case'a''입니까? –

+0

'default : break;'<- 그냥 아무것도 쓰지 않는다면'default' case를 생략하십시오. –

+0

글쎄요, 잘 모르겠지만'$ prog1 -a 1 - b 2 ', 특정 시퀀스? –

답변

0

나는 내가이 코드를 컴파일하고 다음과 같이 실행하면 지금 지금이

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

int main(int argc,char* argv[]) { 
int aa = 0; 

int av = 0; 

int ab = 0; 

int bv = 0; 

int ac = 0; 

int cord = 0;// no c or d = 0, c = 1, d = 2 

//flags and a/b value holders 

int getoptvalue = 0; 

printf("starting getopt\n"); 

while((getoptvalue = getopt(argc,argv,"cda:b:")) != -1){ 

printf("inside getopt\n"); 

    switch(getoptvalue){ 

    case 'a':if(aa||ab){ 

     exit(1); 

     } 

     else{ 

     aa = 1; 

     av = atoi(optarg);//takes int value following 'a' for storage in av? 

     }break; 

    case 'b':if(ab){ 

     exit(1); 

     } 

     else{ 

     ab = 1; 

     bv = atoi(optarg);//takes following int value for storage? 

     }break; 

    case 'c':if(ac){ 

     exit(1); 

     } 

     else{ 

     ac = 1;//c/d switch 

     cord = 1; // showing c was reached 

     }break; 

    case 'd':if(ac){ 

     exit(1); 

     } 

     else{ 

     ac = 1; 

     cord = 2; //showing d was reached 

     }break; 

    default: break; 

    } 

printf("done.\n"); 

} 
return 0; 
} 

과 같은 코드를 변경 한 방법

gcc test.c 
./a.out -a a -b b 
starting getopt 
inside getopt 
done. 
inside getopt 
done. 
inside getopt