2017-03-07 5 views
-1

그래서 argv 배열에서 C의 플래그와 인수에 대한 질문이 있습니다. 터미널을 통해 교환 원을 입력 할 때 : 예 : ./main a b c -a 끝 부분에 -a를 인식하지 못하지만, 다음과 같은 모든 인수의 시작 부분에 넣으면 : ./main -a a b c 이 검색됩니다.C의 깃발 순서

나는 모든 argumetns의 앞에있을 것이기 때문에 그것을 바꿔 치기를 시도했지만, 스왑 후에는 진행하지 않는다. 그 후 for 루프를 무시하는 것과 같은 것입니다. 그래서 그것은 단지 그것을 바꾼 다음 사건을 끝내게됩니다. 아무도 내가 여기에서 놓치고있는 것을 알고 있으면 나는 행복 할 것이다.

코드 :

(A -- 옵션 앞에 표시) 모든 -a 스타일 옵션은 옵션이 아닌 인수하기 전에이있는 경우에도, 처리 할 수 ​​있도록 getopt()의 GNU 버전은 인수의 순열을 허용
while ((c = getopt(argc, argv, ":ahd:")) != -1) { 
    switch (c) { 
     case 'a': 
      if(strcmp(argv[argc-1], "-a") == 0){ 
       swap(&argv[argc-1], &argv[1]); 
      } 
      for(i = optind; i < argc; i++){ 
       for(j = optind; j < argc - 1; j++){ 
        if(strcmp(argv[j], argv[j + 1]) > 0){ 
         swap(&argv[j], &argv[j + 1]); 
        } 
       } 
      } 

      for(z = optind; z < argc; z++){ 
       printf("%s\n", argv[z]); 
      } 
      printf("%s\n", argv[1]); 
      break; 
+3

당신은 그래서 우리는 당신이 잘못하고있는 것을 볼 수 있습니다 질문에 코드 누락하는 경우 변경하여 해결했습니다 좋아? :) –

+1

당신이 "그것은 ...을 인식하지 못한다"고 말할 때 당신이 말하는 "그것"은 무엇입니까? – rici

+0

문제는 프로그램 인수가'argv' 배열에 나타나는지 여부가 아니라 명령 행에서 나타나는 순서대로 나타나지만 프로그램이 수행하는 것입니다. 우리는 프로그램을 발표하지 않았을 때 프로그램이하는 것을 말할 수 없습니다. 코드에 대한 도움이 필요하면 일반적으로 문제를 시연하는 [mcve]가 필요합니다. –

답변

0

그들.

some_program -z abc def -b -- -w warning 

-z-b 옵션

은 GNU getopt()에 의해 인식 될 수 있지만, -w은 비 - 옵션 인수 될 것이다.

getopt()의 POSIX 버전은 이것을 허용하지 않습니다. getopt()이 아닌 많은 GNU 구현은이 작업을 수행하지 않습니다. GNU는 그들이하는 일이 확장이라는 것을 알고 있습니다. 환경에서 POSIXLY_CORRECT을 설정하면 순열 동작을 시작할 수 있습니다.

어디서나 옵션을 인식하려면 프로그램에서 GNU getopt()을 사용하십시오. 로컬 getopt()을 사용하여 이식성을 유지하거나 프로그램에서 GPL 코드를 사용할 여력이 없으면 옵션이 아닌 인수 앞에 옵션을 넣도록 시스템을 설계하십시오. make과 같은 프로그램과 C 컴파일러는 이미 옵션과 옵션이 아닌 인수의 인터리빙을 허용하는 커스텀 인수 처리 시스템을 가지고 있습니다. 그러나 달리해야 할 강력한 이유가없는 한 옵션 처리를 위해서는 POSIX 코딩 지침 (Utility Conventions)을 따라야합니다.

0

나는 문장

if(strcmp(argv[optind-1], "-a") == 0){ 
      swap(&argv[optind-1], &argv[1]); 
     }