2016-08-06 2 views
0

내가 C++ 11 꽤 새로운 그리고 난 정말 명령 줄 인수는 argv를 포인터로 해석하는 방법 그것을 얻을하지 않습니다 ...C++ 11 명령 줄 매개 변수 분리

이 코드를 :

int main(int argc, char* argv[]) 
{ 
    std::string curr_arg = ""; 

    std::string str_base = ""; 
    std::string str_subs_file = ""; 
    std::string str_subs = ""; 

    for(int i = 1; i < argc; i++) 
    { 
     curr_arg = argv[i]; 

     if(curr_arg == "-b" || curr_arg == "--base") 
     { 
      str_base = argv[++i]; 
     } 
     else if(curr_arg == "-f" || curr_arg == "--file") 
     { 
      str_subs_file = argv[++i]; 
     } 
     else if(curr_arg == "-s" || curr_arg == "--subs") 
     { 
      str_subs = argv[++i]; 
     } 
     else 
     { 
      std::cout << "Argument '" << argv[i] << "' is not recognised." << std::endl; 
      return -1; 
     } 
    } 
} 

내가 ./subs -b 기본 -sa 내 프로그램을 호출 = 1,2,3, B = 4,5,6, C = 6,7,8 내가 얻을 것으로 기대 if(curr_arg == "-s" || curr_arg == "--subs" 블록에 입력 할 때 "a = 1,2,3; b = 4,5,6; c = 6,7,8"인수 대신 "a = 1,2,3"및 그 이상을 받는다. . 전체 인수를 따옴표로 묶어서 사용하면 효과가 있음을 알지만, 그런 이유가 무엇인지 이해할 수 없습니다 .. 나에게 설명 할 수있는 사람이 있습니까?

+3

';'는 대부분의 쉘에서 명령 구분 기호입니다. 이것은 C 또는 C++과 아무 관련이 없습니다. – Mat

+0

: 자신 만의 CLI 파서를 쓰고 싶습니까? 왜 기존의 것을 사용하지 않을까요 ('boost :: program_options', ...)? –

+0

오, 좋아, 빠른 답변 주셔서 감사합니다! 난 그냥 과잉 일 것이기 때문에 아무 것도 생각하지 못했을 것입니다. –

답변

3

C++에서는 문제가 발생하지 않지만 명령 셸에서는 문제가 발생하지 않습니다. 쉘이 세미콜론을 명령 분리 자로 사용하기 때문일 것입니다.

쉘이 명령을 ./subs -b base -s a=1,2,3으로 해석하면 세미콜론을 감지하고 다음 명령을 해석합니다.이 경우에는 b=4,5,6이 사용되고 c=6,7,8과 동일합니다.

그것은 꽤 많은 (대부분의 유닉스 쉘에서 작업해야하는) 입력과 동일합니다 :

echo abc; sleep 5; echo def 5 seconds later 

이 인쇄 "ABC는"나중에 "데프 오초 후에"오초와 지문 잔다.

솔루션 :

./subs -b base -s "a=1,2,3;b=4,5,6;c=6,7,8" 

또는 같은 세미콜론 벗어날 수 :

./subs -b base -s a=1,2,3\;b=4,5,6\;c=6,7,8 

두 버전을 당신 같은 따옴표 부분 a=1,2,3;b=4,5,6;c=6,7,8을 캡슐화 할 수, 당신이 원하는 것을 얻으려면 (대부분은 아닐지라도) 유닉스 셸과 윈도우 cmd에서도 잘 작동 할 것입니다.

+0

아, 이것에 대해 전혀 생각하지 않았습니다 ... 답변 해 주셔서 감사합니다! 그런 다음 언급했거나 다른 구분 기호를 사용해야 할 때도 마찬가지입니다 ... –