2014-10-19 3 views
0

나는 내 자신의 명령 셸을 만드는 작업을하고 있습니다. 필자는 입력 문자열을 여러 문자열로 올바르게 토큰 화했습니다. 나는이 문자열을 execvp와 함께 사용하는 방법을 알아 내려고하고있다.문자열 벡터가있는 경우 명령을 실행하기 위해 execvp와 함께 문자열을 사용할 수 있습니까?

vector<string> s; 
s[0] = "ls"; 
s[1] = "-a"; 
s[2] = "-l"; 

내가 명령 ls -a -l 사용 execvp는을 실행할 수 있도록하려면 :

아이디어는이 같은 벡터가있는 경우이다. 나는 execvpconst char *에 소요 생각했기 때문에

나는, const char * 내 문자열을 변환하는 c_str()를 사용하여 생각하지만 나를 위해 작동하지 않았다.

어떻게해야합니까?

귀하의 도움과 의견에 감사드립니다. 정말 감사합니다.

+3

'푸시 백'요소가 필요합니다. 현재 코드에는 UB가 있습니다. – Mahesh

+3

어쨌든 임시 '벡터 ​​'를 쓰지 않는 이유는 무엇입니까? –

+0

@mnunberg 그게 우울 거니? –

답변

0

execvp을 사용하면 char* 포인터 배열을 두 번째 인수로 사용합니다.

  • 포인터의 벡터를 만들
  • 직접
  • 사용하는 벡터 데이터
  • 코드는 옵션을 만들

    1. 을 : 나는 이런 식으로 가겠어요

      char cmd[] = "ls"; 
      char p1[] = "-l"; 
      char p2[] = "-a"; 
      
      vector<char*> parameters; 
      
      parameters.push_back(p1); 
      parameters.push_back(p2); 
      
      
      execvp(cmd, parameters.data()); 
      

      당신 std::vector::data()은 C++ 11 기능이므로 c + 11 컴파일러를 사용할 수있는 경우에만 std::vector::data()을 사용할 수 있습니다. c + 11 컴파일러를 사용하려면 컴파일 옵션에 -std=c++11을 추가하십시오.

      희망이 있습니다.

    +0

    C++ 11이 없다면'parameters.data()'를 모든 버전에서 올바르게 작동하는'& parameters [0]'으로 대체하십시오. –

    0

    나는 그것을 알아 냈다고 생각합니다.

    strings의 벡터를 입력으로 사용하여 char *의 벡터를 출력하는 함수를 만들었습니다.

    vector<char *> stringToChar(vector<string> s){ 
        vector<char *> c; 
    
        for(int i = 0; i < s.size(); ++i){ 
         char *str; 
         str = new char[s[i].size() + 1]; 
         memcpy(str, s[i].c_str(), s[i].size() + 1); 
    
         c.push_back(str); 
        } 
        return c; 
    } 
    
    +0

    데이터를 복사 할 필요가 없습니다. 'char *'는 기존 문자열을 가리킬 수 있습니다. 참조로's'를 전달하고'c.push_back (& ​​s [i] [0]);'을 실행하면됩니다. –