2013-07-07 4 views
2

나는 인자를 인자로 받아 처리하는 간단한 프로그램을 작성 중이다. 2 차원 배열 인 argv에 인수가 있습니다. 하지만 프로그램을 실행하면 쓰레기 값과 세그먼트 오류 오류가 발생합니다. 나는 조건을 종료로 argc를 사용하여 시도하고 그것을 작동합니다. 하지만 포인터를 사용하여 그것을하고 싶습니다. 여기서 포인터가 잘못되었습니다.옵션을 구문 분석하기위한 스위치 케이스

./a.out -h -v -d 

당신이 종료 널 포인터를 찾는 프로그램 인수를 통해 반복 할 경우

+2

, 왜'명령 줄을 구문 분석()'getopt를 사용하지 않는? –

+0

@ H2CO3 : 아마도 이것은 운동입니다. 옵션 구문 분석이 어떻게 어려워 질 수 있는지 설명하는 방법입니다. 다음 수업에서 getopt는 여러분을 위해 그것을 할 수 있습니다! 그것은 마치 getopt를 발견 한 후 시간 낭비였던 것처럼 보일 수 밖에없는 것에 대해 불평하는 학생들의 말을 듣기 위해하는 것처럼 들립니다. –

+0

선택한 답변에서 제안 된 수정을 한 후에도 다음 명령 줄을 사용하여 프로그램을 실행하십시오. "./a.out -"switch 문에서 널 문자를 처리해야합니다 ... – Curt

답변

5
  • , 당신의 외부 사이클

    해야 주셔서 감사합니다 :

    #include<stdio.h> 
    int main(int argc, char *argv[]) 
    { 
        while (++(*argv)) 
        { 
         if (**argv == '-') 
         { 
          switch (*argv[1]) 
          { 
           default: 
            printf("Unknown option -%c\n\n", (*argv)[1]); 
            break; 
           case 'h': 
            printf("\n option h is found"); 
            break; 
           case 'v': 
            printf("option V is found"); 
            break; 
           case 'd': 
            printf("\n option d is found"); 
            break; 
          } 
         } 
         printf("\n outside while : %s", *argv); 
        } 
    } 
    

    프로그램으로 실행

    while (*++argv) 
    

    아니요

    while (++*argv) // <- incorrect! 
    

    코드에 포함되어 있습니다.

  • switch 표현이 잘못 작성되었습니다. 귀하의 의도가 명확한 반면 구현은 연산자 우선 순위를 무시합니다.

    switch (*argv[1]) { // <- incorrect! 
    

    실제로해야

    switch ((*argv)[1]) { 
    
  • 이전 if

    if (**argv == '-') 
    

    괜찮지 만, 그것은

    에 해당하기 때문에

    어쩌면 switch과의 일관성을 위해이 방법으로 다시 작성해야합니다.

+0

Thanks @ AndreyT. (* ++ argv) 및 switch ((* argv) [1])는 예상대로 파일을 작동합니다. –

2

궁극적 인 문제는 조작자 우선 순위입니다. 불필요 할 때 영리하게하려고하지 마십시오. * 연산자는 생각대로 작동하지 않습니다. 내가 대신 [0]를 사용하여 코드를 다시 작성했습니다, 지금은 작동합니다

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    while ((++argv)[0]) 
    { 
      if (argv[0][0] == '-') 
      { 
        switch (argv[0][1]) { 

          default: 
            printf("Unknown option -%c\n\n", argv[0][1]); 
            break; 
          case 'h': 
            printf("\n option h is found"); 
            break; 
          case 'v': 
            printf("option V is found"); 
            break; 
          case 'd': 
            printf("\n option d is found"); 
            break; 
        } 
      } 

      printf("\n outside while : %s", argv[0]); 
    } 
} 
0

argv 문자열의 배열입니다. argv[0]은 귀하의 경우 a.out 인 프로그램 이름입니다. 옵션은 argv[1]부터 시작합니다. 따라서 옵션을 얻으려면 argv을 1에서 argc-1까지 반복해야합니다.

또한 여기 참조 : Parsing Program Arguments 또한

+0

OP는 분명히 외부주기를 while (* ++ argv))으로 만들기위한 것입니다. 이미 "프로그램 이름"인수를 건너 뜁니다. 그러나 그것은 오류와 함께 구현됩니다. – AnT